# HG changeset patch # User insilmaril # Date 1107089927 0 # Node ID 7a96bd401351c600aaa980f89970e74142fcc3dd Initial import. diff -r 000000000000 -r 7a96bd401351 LICENSE --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LICENSE Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,308 @@ + VYM - View Your Mind + Copyright (C) 2004 Uwe Drechsel + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License below for more details. + + In addition, as a special exception, Uwe Drechsel + gives permission to link the code of this program with the QT + libraries from trolltech.com (or with modified versions of QT that + use the same license as QT), and distribute linked combinations + including the two. You must obey the GNU General Public License in + all respects for all of the code used other than QT. If you modify + this file, you may extend this exception to your version of the + file, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + + + Uwe Drechsel can be contacted at <vym@insilmaril.de> + +----------------------------------------------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff -r 000000000000 -r 7a96bd401351 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,737 @@ +############################################################################# +# Makefile for building: vym +# Generated by qmake (1.07a) (Qt 3.3.1) on: Tue Jan 4 10:40:21 2005 +# Project: vym.pro +# Template: app +# Command: $(QMAKE) -o Makefile vym.pro +############################################################################# + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +LEX = flex +YACC = yacc +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 +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 +LEXFLAGS = +YACCFLAGS= -d +INCPATH = -I/usr/lib/qt3/mkspecs/linux-g++ -I. -I/usr/include -I$(QTDIR)/include +LINK = g++ +LFLAGS = +LIBS = $(SUBLIBS) -L/usr/lib64/ -L$(QTDIR)/lib64/ -L/usr/X11R6/lib64/ -lqt-mt -lXext -lX11 -lm +AR = ar cqs +RANLIB = +MOC = $(QTDIR)/bin/moc +UIC = $(QTDIR)/bin/uic +QMAKE = qmake +TAR = tar -cf +GZIP = gzip -9f +COPY = cp -f +COPY_FILE= $(COPY) +COPY_DIR = $(COPY) -r +INSTALL_FILE= $(COPY_FILE) +INSTALL_DIR = $(COPY_DIR) +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +HEADERS = branchobj.h \ + exports.h \ + findwindow.h \ + flagobj.h \ + flagrowobj.h \ + floatimageobj.h \ + floatobj.h \ + frameobj.h \ + headingobj.h \ + imageobj.h \ + linkablemapobj.h \ + mainwindow.h \ + mapcenterobj.h \ + mapeditor.h \ + mapobj.h \ + misc.h \ + noteobj.h \ + ornamentedobj.h \ + process.h \ + selection.h \ + texteditor.h \ + version.h \ + xml.h \ + settings.h \ + options.h +SOURCES = branchobj.cpp \ + exports.cpp \ + findwindow.cpp \ + flagobj.cpp \ + flagrowobj.cpp \ + floatimageobj.cpp \ + floatobj.cpp \ + frameobj.cpp \ + headingobj.cpp \ + imageobj.cpp \ + linkablemapobj.cpp \ + main.cpp \ + mainwindow.cpp \ + mapcenterobj.cpp \ + mapeditor.cpp \ + mapobj.cpp \ + misc.cpp \ + noteobj.cpp \ + ornamentedobj.cpp \ + process.cpp \ + selection.cpp \ + texteditor.cpp \ + xml.cpp \ + settings.cpp \ + options.cpp +OBJECTS = branchobj.o \ + exports.o \ + findwindow.o \ + flagobj.o \ + flagrowobj.o \ + floatimageobj.o \ + floatobj.o \ + frameobj.o \ + headingobj.o \ + imageobj.o \ + linkablemapobj.o \ + main.o \ + mainwindow.o \ + mapcenterobj.o \ + mapeditor.o \ + mapobj.o \ + misc.o \ + noteobj.o \ + ornamentedobj.o \ + process.o \ + selection.o \ + texteditor.o \ + xml.o \ + settings.o \ + options.o \ + exporthtmldialog.o \ + exportxhtmldialog.o \ + showtextdialog.o \ + extrainfodialog.o +FORMS = exporthtmldialog.ui \ + exportxhtmldialog.ui \ + showtextdialog.ui \ + extrainfodialog.ui +UICDECLS = exporthtmldialog.h \ + exportxhtmldialog.h \ + showtextdialog.h \ + extrainfodialog.h +UICIMPLS = exporthtmldialog.cpp \ + exportxhtmldialog.cpp \ + showtextdialog.cpp \ + extrainfodialog.cpp +SRCMOC = moc_findwindow.cpp \ + moc_linkablemapobj.cpp \ + moc_mainwindow.cpp \ + moc_mapeditor.cpp \ + moc_ornamentedobj.cpp \ + moc_process.cpp \ + moc_texteditor.cpp \ + moc_exporthtmldialog.cpp \ + moc_exportxhtmldialog.cpp \ + moc_showtextdialog.cpp \ + moc_extrainfodialog.cpp +OBJMOC = moc_findwindow.o \ + moc_linkablemapobj.o \ + moc_mainwindow.o \ + moc_mapeditor.o \ + moc_ornamentedobj.o \ + moc_process.o \ + moc_texteditor.o \ + moc_exporthtmldialog.o \ + moc_exportxhtmldialog.o \ + moc_showtextdialog.o \ + moc_extrainfodialog.o +DIST = vym.pro +QMAKE_TARGET = vym +DESTDIR = +TARGET = vym + +first: all +####### Implicit rules + +.SUFFIXES: .c .o .cpp .cc .cxx .C + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $< + +####### Build rules + +all: Makefile $(TARGET) + +$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS) + +mocables: $(SRCMOC) +uicables: $(UICDECLS) $(UICIMPLS) + +$(MOC): + ( cd $(QTDIR)/src/moc && $(MAKE) ) + +Makefile: vym.pro /usr/lib/qt3/mkspecs/linux-g++/qmake.conf /usr/lib/qt3/lib64/libqt-mt.prl + $(QMAKE) -o Makefile vym.pro +qmake: + @$(QMAKE) -o Makefile vym.pro + +dist: + @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 + +mocclean: + -$(DEL_FILE) $(OBJMOC) + -$(DEL_FILE) $(SRCMOC) + +uiclean: + -$(DEL_FILE) $(UICIMPLS) $(UICDECLS) + +yaccclean: +lexclean: +clean: mocclean uiclean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +####### Sub-libraries + +distclean: clean + -$(DEL_FILE) $(TARGET) $(TARGET) + + +FORCE: + +####### Compile + +branchobj.o: branchobj.cpp branchobj.h \ + texteditor.h \ + mapeditor.h \ + mainwindow.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h \ + mapcenterobj.h \ + version.h \ + xml.h \ + findwindow.h + +exports.o: exports.cpp exports.h \ + linkablemapobj.h \ + mapcenterobj.h \ + branchobj.h \ + version.h \ + floatimageobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +findwindow.o: findwindow.cpp findwindow.h + +flagobj.o: flagobj.cpp flagobj.h \ + mapobj.h \ + imageobj.h \ + misc.h + +flagrowobj.o: flagrowobj.cpp flagrowobj.h \ + mapobj.h \ + flagobj.h \ + misc.h \ + imageobj.h + +floatimageobj.o: floatimageobj.cpp floatimageobj.h \ + branchobj.h \ + floatobj.h \ + linkablemapobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h \ + ornamentedobj.h + +floatobj.o: floatobj.cpp floatobj.h \ + linkablemapobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +frameobj.o: frameobj.cpp frameobj.h \ + mapobj.h \ + misc.h + +headingobj.o: headingobj.cpp headingobj.h \ + mapobj.h \ + misc.h + +imageobj.o: imageobj.cpp imageobj.h \ + mapobj.h \ + misc.h + +linkablemapobj.o: linkablemapobj.cpp linkablemapobj.h \ + branchobj.h \ + mapeditor.h \ + version.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h \ + floatimageobj.h \ + ornamentedobj.h \ + floatobj.h \ + mapcenterobj.h + +main.o: main.cpp settings.h \ + options.h \ + mainwindow.h \ + icons/vym-48x48.xpm \ + icons/vym-editor.xpm \ + flagrowobj.h \ + misc.h \ + xml.h \ + texteditor.h \ + mapeditor.h \ + findwindow.h \ + mapcenterobj.h \ + branchobj.h \ + version.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + mapobj.h \ + flagobj.h \ + imageobj.h + +mainwindow.o: mainwindow.cpp mainwindow.h \ + version.h \ + icons/filenew.xpm \ + icons/fileopen.xpm \ + icons/filesave.xpm \ + icons/fileprint.xpm \ + icons/editundo.xpm \ + icons/editcopy.xpm \ + icons/editcut.xpm \ + icons/editpaste.xpm \ + icons/editmoveup.xpm \ + icons/editmovedown.xpm \ + icons/formatcoloritem.xpm \ + icons/formatcolorbranch.xpm \ + icons/formatcolorpicker.xpm \ + icons/viewzoomreset.xpm \ + icons/viewzoomin.xpm \ + icons/viewzoomout.xpm \ + icons/vym-48x48.xpm \ + icons/flag-note.xpm \ + icons/flag-url.xpm \ + icons/flag-vymlink.xpm \ + icons/flag-scrolled-right.xpm \ + flagrowobj.h \ + texteditor.h \ + mapeditor.h \ + exporthtmldialog.h \ + exportxhtmldialog.h \ + showtextdialog.h \ + process.h \ + settings.h \ + options.h \ + xml.h \ + findwindow.h \ + mapcenterobj.h \ + branchobj.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +mapcenterobj.o: mapcenterobj.cpp mapcenterobj.h \ + floatimageobj.h \ + mapeditor.h \ + branchobj.h \ + version.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +mapeditor.o: mapeditor.cpp mapeditor.h \ + version.h \ + xml.h \ + texteditor.h \ + linkablemapobj.h \ + exports.h \ + misc.h \ + mainwindow.h \ + extrainfodialog.h \ + settings.h \ + icons/flag-note.xpm \ + icons/flag-url.xpm \ + icons/flag-vymlink.xpm \ + icons/flag-scrolled-right.xpm \ + icons/flag-tmpUnscrolled-right.xpm \ + icons/flag-questionmark.xpm \ + icons/flag-exclamationmark.xpm \ + icons/flag-hook-green.xpm \ + icons/flag-cross-red.xpm \ + icons/flag-stopsign.xpm \ + icons/flag-smiley-good.xpm \ + icons/flag-smiley-sad.xpm \ + icons/flag-clock.xpm \ + icons/flag-lamp.xpm \ + icons/flag-arrow-up.xpm \ + icons/flag-arrow-down.xpm \ + icons/flag-thumb-up.xpm \ + icons/flag-thumb-down.xpm \ + icons/flag-heart.xpm \ + icons/flag-flash.xpm \ + icons/flag-lifebelt.xpm \ + mapcenterobj.h \ + branchobj.h \ + floatimageobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + flagobj.h \ + imageobj.h \ + findwindow.h + +mapobj.o: mapobj.cpp mapobj.h \ + misc.h + +misc.o: misc.cpp misc.h + +noteobj.o: noteobj.cpp noteobj.h \ + misc.h + +ornamentedobj.o: ornamentedobj.cpp ornamentedobj.h \ + texteditor.h \ + mapeditor.h \ + linkablemapobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h \ + mapcenterobj.h \ + branchobj.h \ + version.h \ + floatimageobj.h \ + floatobj.h + +process.o: process.cpp process.h + +selection.o: selection.cpp selection.h \ + linkablemapobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +texteditor.o: texteditor.cpp texteditor.h \ + icons/fileopen.xpm \ + icons/filesave.xpm \ + icons/fileprint.xpm \ + icons/editundo.xpm \ + icons/editredo.xpm \ + icons/editcopy.xpm \ + icons/editcut.xpm \ + icons/editpaste.xpm \ + icons/edittrash.xpm \ + icons/formatfixedfont.xpm \ + icons/formattextbold.xpm \ + icons/formattextitalic.xpm \ + icons/formattextunder.xpm \ + icons/formattextleft.xpm \ + icons/formattextcenter.xpm \ + icons/formattextright.xpm \ + icons/formattextjustify.xpm + +xml.o: xml.cpp xml.h \ + misc.h \ + settings.h \ + version.h \ + mapcenterobj.h \ + mapeditor.h \ + branchobj.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + flagobj.h \ + imageobj.h + +settings.o: settings.cpp settings.h \ + misc.h + +options.o: options.cpp options.h + +exporthtmldialog.h: exporthtmldialog.ui showtextdialog.h + $(UIC) exporthtmldialog.ui -o exporthtmldialog.h + +exporthtmldialog.cpp: exporthtmldialog.h exporthtmldialog.ui showtextdialog.h + $(UIC) exporthtmldialog.ui -i exporthtmldialog.h -o exporthtmldialog.cpp + +exportxhtmldialog.h: exportxhtmldialog.ui process.h \ + showtextdialog.h + $(UIC) exportxhtmldialog.ui -o exportxhtmldialog.h + +exportxhtmldialog.cpp: exportxhtmldialog.h exportxhtmldialog.ui process.h \ + showtextdialog.h + $(UIC) exportxhtmldialog.ui -i exportxhtmldialog.h -o exportxhtmldialog.cpp + +showtextdialog.h: showtextdialog.ui + $(UIC) showtextdialog.ui -o showtextdialog.h + +showtextdialog.cpp: showtextdialog.h showtextdialog.ui + $(UIC) showtextdialog.ui -i showtextdialog.h -o showtextdialog.cpp + +extrainfodialog.h: extrainfodialog.ui + $(UIC) extrainfodialog.ui -o extrainfodialog.h + +extrainfodialog.cpp: extrainfodialog.h extrainfodialog.ui + $(UIC) extrainfodialog.ui -i extrainfodialog.h -o extrainfodialog.cpp + +exporthtmldialog.o: exporthtmldialog.cpp settings.h \ + misc.h \ + icons/flag-url.xpm \ + exporthtmldialog.ui.h \ + exporthtmldialog.h + +exportxhtmldialog.o: exportxhtmldialog.cpp settings.h \ + icons/flag-url.xpm \ + exportxhtmldialog.ui.h \ + exportxhtmldialog.h + +showtextdialog.o: showtextdialog.cpp showtextdialog.ui.h \ + showtextdialog.h + +extrainfodialog.o: extrainfodialog.cpp extrainfodialog.ui.h \ + extrainfodialog.h + +moc_findwindow.o: moc_findwindow.cpp findwindow.h + +moc_linkablemapobj.o: moc_linkablemapobj.cpp linkablemapobj.h frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +moc_mainwindow.o: moc_mainwindow.cpp mainwindow.h xml.h \ + texteditor.h \ + mapeditor.h \ + findwindow.h \ + mapcenterobj.h \ + branchobj.h \ + version.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +moc_mapeditor.o: moc_mapeditor.cpp mapeditor.h mapcenterobj.h \ + misc.h \ + branchobj.h \ + version.h \ + floatimageobj.h \ + linkablemapobj.h \ + ornamentedobj.h \ + floatobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + flagobj.h \ + imageobj.h + +moc_ornamentedobj.o: moc_ornamentedobj.cpp ornamentedobj.h linkablemapobj.h \ + frameobj.h \ + noteobj.h \ + headingobj.h \ + flagrowobj.h \ + mapobj.h \ + misc.h \ + flagobj.h \ + imageobj.h + +moc_process.o: moc_process.cpp process.h + +moc_texteditor.o: moc_texteditor.cpp texteditor.h + +moc_exporthtmldialog.o: moc_exporthtmldialog.cpp exporthtmldialog.h showtextdialog.h + +moc_exportxhtmldialog.o: moc_exportxhtmldialog.cpp exportxhtmldialog.h process.h \ + showtextdialog.h + +moc_showtextdialog.o: moc_showtextdialog.cpp showtextdialog.h + +moc_extrainfodialog.o: moc_extrainfodialog.cpp extrainfodialog.h + +moc_findwindow.cpp: $(MOC) findwindow.h + $(MOC) findwindow.h -o moc_findwindow.cpp + +moc_linkablemapobj.cpp: $(MOC) linkablemapobj.h + $(MOC) linkablemapobj.h -o moc_linkablemapobj.cpp + +moc_mainwindow.cpp: $(MOC) mainwindow.h + $(MOC) mainwindow.h -o moc_mainwindow.cpp + +moc_mapeditor.cpp: $(MOC) mapeditor.h + $(MOC) mapeditor.h -o moc_mapeditor.cpp + +moc_ornamentedobj.cpp: $(MOC) ornamentedobj.h + $(MOC) ornamentedobj.h -o moc_ornamentedobj.cpp + +moc_process.cpp: $(MOC) process.h + $(MOC) process.h -o moc_process.cpp + +moc_texteditor.cpp: $(MOC) texteditor.h + $(MOC) texteditor.h -o moc_texteditor.cpp + +moc_exporthtmldialog.cpp: $(MOC) exporthtmldialog.h + $(MOC) exporthtmldialog.h -o moc_exporthtmldialog.cpp + +moc_exportxhtmldialog.cpp: $(MOC) exportxhtmldialog.h + $(MOC) exportxhtmldialog.h -o moc_exportxhtmldialog.cpp + +moc_showtextdialog.cpp: $(MOC) showtextdialog.h + $(MOC) showtextdialog.h -o moc_showtextdialog.cpp + +moc_extrainfodialog.cpp: $(MOC) extrainfodialog.h + $(MOC) extrainfodialog.h -o moc_extrainfodialog.cpp + +####### Install + +install_target: all + @$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/bin/" || $(MKDIR) "$(INSTALL_ROOT)/usr/bin/" + -$(INSTALL_FILE) "$(QMAKE_TARGET)" "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)" + +uninstall_target: + -$(DEL_FILE) "$(INSTALL_ROOT)/usr/bin/$(QMAKE_TARGET)" + -$(DEL_DIR) "$(INSTALL_ROOT)/usr/bin/" + + +install_support: all + @$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/share/vym/" || $(MKDIR) "$(INSTALL_ROOT)/usr/share/vym/" + -$(INSTALL_DIR) "styles" "$(INSTALL_ROOT)/usr/share/vym/" + -$(INSTALL_DIR) "scripts" "$(INSTALL_ROOT)/usr/share/vym/" + -$(INSTALL_DIR) "icons" "$(INSTALL_ROOT)/usr/share/vym/" + + +uninstall_support: + -$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/styles" + -$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/scripts" + -$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/icons" + -$(DEL_DIR) "$(INSTALL_ROOT)/usr/share/vym/" + + +install_demo: all + @$(CHK_DIR_EXISTS) "$(INSTALL_ROOT)/usr/share/vym/" || $(MKDIR) "$(INSTALL_ROOT)/usr/share/vym/" + -$(INSTALL_DIR) "demos" "$(INSTALL_ROOT)/usr/share/vym/" + + +uninstall_demo: + -$(DEL_FILE) -r "$(INSTALL_ROOT)/usr/share/vym/demos" + -$(DEL_DIR) "$(INSTALL_ROOT)/usr/share/vym/" + + +install: install_target install_support install_demo + +uninstall: uninstall_target uninstall_support uninstall_demo + diff -r 000000000000 -r 7a96bd401351 branchobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/branchobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,1184 @@ +#include "branchobj.h" +#include "texteditor.h" +#include "mapeditor.h" +#include "mainwindow.h" + +extern TextEditor *textEditor; +extern Main *mainWindow; +extern FlagRowObj *standardFlagsDefault; +extern QAction *actionEditOpenURL; + + +///////////////////////////////////////////////////////////////// +// BranchObj +///////////////////////////////////////////////////////////////// + +BranchObj* BranchObj::itLast=NULL; + + +BranchObj::BranchObj () :OrnamentedObj() +{ +// cout << "Const BranchObj ()\n"; + setParObj (this); + init(); + depth=-1; +} + +BranchObj::BranchObj (QCanvas* c):OrnamentedObj (c) +{ +// cout << "Const BranchObj (c) called from MapCenterObj (c)\n"; + canvas=c; +} + +BranchObj::BranchObj (QCanvas* c, LinkableMapObj* p):OrnamentedObj (c) +{ +// cout << "Const BranchObj (c,p)\n"; + canvas=c; + setParObj (p); + depth=p->getDepth()+1; + if (depth==1) + // Calc angle to mapCenter if I am a mainbranch + // needed for reordering the mainbranches clockwise + // around mapcenter + angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), + (int)(y() - parObj->getChildPos().y() ) ) ); + init(); +} + +BranchObj::~BranchObj () +{ + //cout << "Destr BranchObj\n"; + // Check, if this branch was the last child to be deleted + // If so, unset the scrolled flags + + BranchObj *po=(BranchObj*)(parObj); + if (po) + { + BranchObj *bo=((BranchObj*)(parObj))->getLastBranch(); + if (!bo) po->unScroll(); + } +} + +bool BranchObj::operator< ( const BranchObj & other ) +{ + return angle < other.angle; +} + +bool BranchObj::operator== ( const BranchObj & other ) +{ + return angle == other.angle; +} + +int BranchObjPtrList::compareItems ( QPtrCollection::Item i, QPtrCollection::Item j) +{ + // Make sure PtrList::find works + if (i==j) return 0; + + if ( ((BranchObj*)(i))->angle > ((BranchObj*)(j))->angle ) + return 1; + else + return -1; +} + +void BranchObj::init () +{ + branch.setAutoDelete (true); + floatimage.setAutoDelete (true); + + absPos=getRandPos(); + absPos+=parObj->getChildPos(); + + // TODO This should be done in TextObj later + QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0"); +// font.setPointSize(12); + heading->setFont(font ); +// heading->setText(QObject::tr("new branch")); + + lastSelectedBranch=-1; + + setChildObj(this); + + scrolled=false; + tmpUnscrolled=false; + + url=""; + vymLink=""; +} + +void BranchObj::copy (BranchObj* other) +{ + OrnamentedObj::copy(other); + + branch.clear(); + BranchObj* b; + for (b=other->branch.first(); b;b=other->branch.next() ) + // Make deep copy of b + // Because addBranch again calls copy for the childs, + // Those will get a deep copy, too + addBranch(b); + + FloatImageObj *fi; + for (fi=other->floatimage.first(); fi;fi=other->floatimage.next() ) + addFloatImage (fi); + + scrolled=other->scrolled; + tmpUnscrolled=other->tmpUnscrolled; + setVisibility (other->visible); + + url=other->url; + vymLink=other->vymLink; + + angle=other->angle; + + positionBBox(); +} + +void BranchObj::clear() +{ + branch.clear(); + floatimage.clear(); +} + +int BranchObj::getNum() +{ + if (parObj) + return ((BranchObj*)(parObj))->getNum ((BranchObj*)(this)); + else + return 0; +} + +int BranchObj::getNum(BranchObj *bo) +{ + return branch.findRef (bo); +} + +int BranchObj::getFloatImageNum(FloatImageObj *fio) +{ + return floatimage.findRef (fio); +} + +int BranchObj::countBranches() +{ + return branch.count(); +} + +int BranchObj::countFloatImages() +{ + return floatimage.count(); +} + +void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPoint m, int off) +{ + // Temporary link to lmo + // m is position of mouse pointer + // offset 0: default 1: below lmo -1 above lmo (if possible) + + + BranchObj* o=(BranchObj*)(lmo); + if (!parObjTmpBuf) + parObjTmpBuf=parObj; + + // ignore mapcenter and mainbranch + if (lmo->getDepth()<2) off=0; + if (off==0) + { + link2ParPos=false; + parObj=o; + } + else + { + link2ParPos=true; + if (off>0) + parObj=o->getParObj(); + else + parObj=o->getParObj(); + parObj=o; + } + + depth=parObj->getDepth()+1; + + // setLinkStyle calls updateLink, only set it once + if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle()); + + // Move temporary to new position at destination + // Usually the positioning would be done by reposition(), + // but then also the destination branch would "Jump" around... + // Better just do it approximately + if (depth==1) + { // new parent is the mapcenter itself + + QPoint p= normalise ( QPoint (m.x() - o->getChildPos().x(), + m.y() - o->getChildPos().y() )); + if (p.x()<0) p.setX( p.x()-bbox.width() ); + move2RelPos (p); + } else + { + int y; + if (off==0) + { + // new parent is just a branch, link to it + QRect t=o->getBBoxSizeWithChilds(); + if (o->getLastBranch()) + y=t.y() + t.height() ; + else + y=t.y(); + + } else + { + if (off<0) + // we want to link above lmo + y=o->y() - height() + 5; + else + // we want to link below lmo + // Bottom of sel should be 5 pixels above + // the bottom of the branch _below_ the target: + // Don't try to find that branch, guess 12 pixels + y=o->getChildPos().y() -height() + 12; + } + if (o->getOrientation()==OrientLeftOfCenter) + move ( o->getChildPos().x() - linkwidth, y ); + else + move (o->getChildPos().x() + linkwidth, y ); + } + + // updateLink is called implicitly in move + reposition(); // FIXME shouldn't be this a request? +} + +void BranchObj::unsetParObjTmp() +{ + if (parObjTmpBuf) + { + link2ParPos=false; + parObj=parObjTmpBuf; + parObjTmpBuf=NULL; + depth=parObj->getDepth()+1; + setLinkStyle (getDefLinkStyle() ); + } +} + +void BranchObj::unScroll() +{ + if (tmpUnscrolled) resetTmpUnscroll(); + if (scrolled) toggleScroll(); +} + +void BranchObj::toggleScroll() +{ + BranchObj *bo; + if (scrolled) + { + scrolled=false; + systemFlags->deactivate("scrolledright"); + for (bo=branch.first(); bo; bo=branch.next() ) + { + bo->setVisibility(true); + } + } else + { + scrolled=true; + systemFlags->activate("scrolledright"); + for (bo=branch.first(); bo; bo=branch.next() ) + { + bo->setVisibility(false); + } + } + calcBBoxSize(); + positionBBox(); + move (absPos.x(), absPos.y() ); + forceReposition(); +} + +bool BranchObj::isScrolled() +{ + return scrolled; +} + +bool BranchObj::hasScrolledParent(BranchObj *start) +{ + // Calls parents recursivly to + // find out, if we are scrolled at all. + // But ignore myself, just look at parents. + + if (this !=start && scrolled) return true; + + BranchObj* bo=(BranchObj*)(parObj); + if (bo) + return bo->hasScrolledParent(start); + else + return false; +} + +void BranchObj::tmpUnscroll() +{ + // Unscroll parent (recursivly) + BranchObj* bo=(BranchObj*)(parObj); + if (bo) bo->tmpUnscroll(); + + // Unscroll myself + if (scrolled) + { + tmpUnscrolled=true; + systemFlags->activate("tmpUnscrolledright"); + toggleScroll(); + } +} + +void BranchObj::resetTmpUnscroll() +{ + // Unscroll parent (recursivly) + BranchObj* bo=(BranchObj*)(parObj); + if (bo) + bo->resetTmpUnscroll(); + + // Unscroll myself + if (tmpUnscrolled) + { + tmpUnscrolled=false; + systemFlags->deactivate("tmpUnscrolledright"); + toggleScroll(); + } +} + +void BranchObj::setVisibility(bool v, int toDepth) +{ + if (depth <= toDepth) + { + frame->setVisibility(v); + heading->setVisibility(v); + systemFlags->setVisibility(v); + standardFlags->setVisibility(v); + LinkableMapObj::setVisibility (v); + + if (!scrolled && (depth < toDepth)) + { + // Now go recursivly through all childs + BranchObj* b; + for (b=branch.first(); b;b=branch.next() ) + b->setVisibility (v,toDepth); + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next()) + fio->setVisibility (v); + } + } // depth <= toDepth + move (absPos.x(), absPos.y() ); + requestReposition(); +} + +void BranchObj::setVisibility(bool v) +{ + setVisibility (v,MAX_DEPTH); +} + + +void BranchObj::setLinkColor () +{ + // Overloaded from LinkableMapObj + // BranchObj can use color of heading + + if (mapEditor->getLinkColorHint()==HeadingColor) + LinkableMapObj::setLinkColor (heading->getColor() ); + else + LinkableMapObj::setLinkColor (); +} + +void BranchObj::setColor (QColor col, bool colorChilds) +{ + heading->setColor(col); + setLinkColor(); + if (colorChilds) + { + BranchObj *bo; + for (bo=branch.first(); bo; bo=branch.next() ) + bo->setColor(col,colorChilds); + } +} + + +BranchObj* BranchObj::first() +{ + itLast=NULL; + return this; +} + +BranchObj* BranchObj::next() +{ + BranchObj *lmo; + BranchObj *bo=branch.first(); + BranchObj *po=(BranchObj*)(parObj); + + if (!itLast) + { // We are just beginning at the mapCenter + if (bo) + { + itLast=this; + return bo; + } + else + { + itLast=NULL; + return NULL; + } + } + + if (itLast==parObj) + { // We come from above + if (bo) + { + // there are childs, go there + itLast=this; + return bo; + } + else + { // no childs, try to go up again + if (po) + { + // go up + itLast=this; + lmo=po->next(); + itLast=this; + return lmo; + + } + else + { + // can't go up, I am mapCenter + itLast=NULL; + return NULL; + } + } + } + + // Try to find last child, we came from, in my own childs + bool searching=true; + while (bo && searching) + { + if (itLast==bo) searching=false; + bo=branch.next(); + } + if (!searching) + { // found lastLMO in my childs + if (bo) + { + // found a brother of lastLMO + itLast=this; + return bo; + } + else + { + if (po) + { + // go up + itLast=this; + lmo=po->next(); + itLast=this; + return lmo; + } + else + { + // can't go up, I am mapCenter + itLast=NULL; + return NULL; + } + } + } + + // couldn't find last child, it must be a nephew of mine + bo=branch.first(); + if (bo) + { + // proceed with my first child + itLast=this; + return bo; + } + else + { + // or go back to my parents + if (po) + { + // go up + itLast=this; + lmo=po->next(); + itLast=this; + return lmo; + } + else + { + // can't go up, I am mapCenter + itLast=NULL; + return NULL; + } + } +} + +BranchObj* BranchObj::getLastIterator() +{ + return itLast; +} + +void BranchObj::setLastIterator(BranchObj* it) +{ + itLast=it; +} + + +void BranchObj::move (double x, double y) +{ + OrnamentedObj::move (x,y); + positionBBox(); +} + +void BranchObj::move (QPoint p) +{ + move (p.x(), p.y()); +} + +void BranchObj::moveBy (double x, double y) +{ + OrnamentedObj::moveBy (x,y); + positionBBox(); + BranchObj* b; + for (b=branch.first(); b;b=branch.next() ) + b->moveBy (x,y); +} + +void BranchObj::moveBy (QPoint p) +{ + moveBy (p.x(), p.y()); +} + + +void BranchObj::positionBBox() +{ + + heading->positionBBox(); + systemFlags->positionBBox(); + standardFlags->positionBBox(); + // It seems that setting x,y also affects width,height + int w_old=bbox.width(); + int h_old=bbox.height(); + bbox.setX (absPos.x() ); + bbox.setY (absPos.y() ); + bbox.setWidth(w_old); + bbox.setHeight(h_old); + + + setSelBox(); + + // set the frame + frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) ); +} + +void BranchObj::calcBBoxSize() +{ + QSize heading_r=heading->getSize(); + int heading_w=static_cast <int> (heading_r.width() ); + int heading_h=static_cast <int> (heading_r.height() ); + QSize sysflags_r=systemFlags->getSize(); + int sysflags_h=sysflags_r.height(); + int sysflags_w=sysflags_r.width(); + QSize stanflags_r=standardFlags->getSize(); + int stanflags_h=stanflags_r.height(); + int stanflags_w=stanflags_r.width(); + int w; + int h; + + // set width to sum of all widths + w=heading_w + sysflags_w + stanflags_w; + // set height to maximum needed height + h=max (sysflags_h,stanflags_h); + h=max (h,heading_h); + + w+=frame->getBorder(); + h+=frame->getBorder(); + bbox.setSize (QSize (w,h)); +} + +LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO) +{ + // Search branches + BranchObj *b; + LinkableMapObj *lmo; + for (b=branch.first(); b; b=branch.next() ) + { + lmo=b->findMapObj(p, excludeLMO); + if (lmo != NULL) return lmo; + } + + // Search myself + if (inBBox (p) && (this != excludeLMO) && isVisibleObj() ) + return this; + + // Search float images + FloatImageObj *foi; + for (foi=floatimage.first(); foi; foi=floatimage.next() ) + if (foi->inBBox(p) && (foi != excludeLMO) && foi->getParObj()!= excludeLMO) return foi; + + return NULL; +} + +void BranchObj::setHeading(QString s) +{ + // Adjusting font size + QFont font=heading->getFont(); + if (depth==0) + font.setPointSize(16); + else + if (depth>1) + font.setPointSize(10); + else + font.setPointSize(12); + heading->setFont(font); + heading->setText(s); // set new heading + calcBBoxSize(); // recalculate bbox + positionBBox(); // rearrange contents + requestReposition(); +} + +void BranchObj::setURL(QString s) +{ + url=s; + if (!url.isEmpty()) + systemFlags->activate("url"); + else + systemFlags->deactivate("url"); + calcBBoxSize(); // recalculate bbox + positionBBox(); // rearrange contents + forceReposition(); +} + +QString BranchObj::getURL() +{ + return url; +} + +void BranchObj::setVymLink(QString s) +{ + if (!s.isEmpty()) + { + // We need the relative (from loading) + // or absolute path (from User event) + // and build the absolute path. + // Note: If we have relative, use path of + // current map to build absolute path + QDir d(s); + if (!d.path().startsWith ("/")) + { + QString p=mapEditor->getDestPath(); + int i=p.findRev("/",-1); + d.setPath(p.left(i)+"/"+s); + d.convertToAbs(); + } + vymLink=d.path(); + systemFlags->activate("vymLink"); + } + else + { + systemFlags->deactivate("vymLink"); + vymLink=""; + } + calcBBoxSize(); // recalculate bbox + positionBBox(); // rearrange contents + forceReposition(); +} + +QString BranchObj::getVymLink() +{ + return vymLink; +} + +QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset) +{ + QString s,a; + QString scrolledAttr; + if (scrolled) + scrolledAttr=attribut ("scrolled","yes"); + else + scrolledAttr=""; + + QString posAttr; + if (depth<2) posAttr= + attribut("absPosX",QString().setNum(absPos.x(),10)) + + attribut("absPosY",QString().setNum(absPos.y(),10)); + else + posAttr=""; + + QString urlAttr; + if (!url.isEmpty()) + urlAttr=attribut ("url",url); + + QString vymLinkAttr; + if (!vymLink.isEmpty()) + vymLinkAttr=attribut ("vymLink",convertToRel(mapEditor->getDestPath(),vymLink) ); + + QString frameAttr; + if (frame->getFrameType()!=NoFrame) + frameAttr=attribut ("frameType",frame->getFrameTypeName()); + else + frameAttr=""; + + // save area, if not scrolled + QString areaAttr; + if (!((BranchObj*)(parObj))->isScrolled() ) + { + areaAttr= + attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) + + attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) + + attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) + + attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10)); + + } else + areaAttr=""; + + s=beginElement ("branch" +scrolledAttr +posAttr +urlAttr +vymLinkAttr +frameAttr +areaAttr); + incIndent(); + + // save heading + s=s+valueElement("heading", getHeading(), + attribut ("textColor",QColor(heading->getColor()).name())); + + // save names of flags set + s+=standardFlags->saveToDir(tmpdir,prefix,0); + + // save note + if (!note.isEmpty() ) + s+=note.saveToDir(); + + // Save branches + BranchObj *bo; + for (bo=branch.first(); bo; bo=branch.next() ) + s+=bo->saveToDir(tmpdir,prefix,offset); + decIndent(); + + // Save FloatImages + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next() ) + s+=fio->saveToDir (tmpdir,prefix); + + s+=endElement ("branch"); + return s; +} + +LinkableMapObj* BranchObj::addFloatImage () +{ + FloatImageObj *newfi=new FloatImageObj (canvas,this); + floatimage.append (newfi); + if (hasScrolledParent(this) ) + newfi->setVisibility (false); + else + newfi->setVisibility(visible); + requestReposition(); + return newfi; +} + +LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio) +{ + FloatImageObj *newfi=new FloatImageObj (canvas,this); + floatimage.append (newfi); + newfi->copy (fio); + if (hasScrolledParent(this) ) + newfi->setVisibility (false); + else + newfi->setVisibility(visible); + requestReposition(); + return newfi; +} + +FloatImageObj* BranchObj::getFirstFloatImage () +{ + return floatimage.first(); +} + +FloatImageObj* BranchObj::getLastFloatImage () +{ + return floatimage.last(); +} + +FloatImageObj* BranchObj::getFloatImageNum (const uint &i) +{ + return floatimage.at(i); +} + +void BranchObj::removeFloatImage (FloatImageObj *fio) +{ + floatimage.remove (fio); + requestReposition(); +} + +void BranchObj::savePosInAngle () +{ + // Save position in angle + BranchObj *b; + int i=0; + for (b=branch.first(); b; b=branch.next() ) + { + b->angle=i; + i++; + } +} + +BranchObj* BranchObj::addBranch() +{ + BranchObj* newbo=new BranchObj(canvas,this); + branch.append (newbo); + newbo->setParObj(this); + newbo->setColor(getColor(),false); + newbo->setLinkColor(); + newbo->setHeading ("new"); + newbo->setLinkStyle (newbo->getDefLinkStyle()); + if (scrolled) + newbo->setVisibility (false); + else + newbo->setVisibility(visible); + requestReposition(); + return newbo; +} + +BranchObj* BranchObj::addBranch(BranchObj* bo) +{ + BranchObj* newbo=new BranchObj(canvas,this); + branch.append (newbo); + newbo->copy(bo); + newbo->setParObj(this); + newbo->setHeading (newbo->getHeading()); // adjust fontsize to depth + newbo->setLinkStyle (newbo->getDefLinkStyle()); + if (scrolled) + newbo->setVisibility (false); + else + newbo->setVisibility(bo->visible); + requestReposition(); + return newbo; +} + +BranchObj* BranchObj::insertBranch(int pos) +{ + savePosInAngle(); + // Add new bo and resort branches + BranchObj *newbo=addBranch (); + newbo->angle=pos-0.5; + branch.sort(); + return newbo; +} + +BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos) +{ + savePosInAngle(); + // Add new bo and resort branches + bo->angle=pos-0.5; + BranchObj *newbo=addBranch (bo); + branch.sort(); + return newbo; +} + +void BranchObj::removeBranch(BranchObj* bo) +{ + // if bo is not in branch remove returns false, we + // don't care... + branch.remove (bo); + requestReposition(); +} + +void BranchObj::setLastSelectedBranch (BranchObj* bo) +{ + lastSelectedBranch=branch.find(bo); +} + +BranchObj* BranchObj::getLastSelectedBranch () +{ + if (lastSelectedBranch>=0) + { + BranchObj* bo=branch.at(lastSelectedBranch); + if (bo) return bo; + } + return branch.first(); +} + +BranchObj* BranchObj::getFirstBranch () +{ + return branch.first(); +} + +BranchObj* BranchObj::getLastBranch () +{ + return branch.last(); +} + +BranchObj* BranchObj::getBranchNum (const uint &i) +{ + return branch.at(i); +} + + +BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // move a branch up (modify myself) +{ + savePosInAngle(); + int i=branch.find(bo1); + if (i>0) + { // -1 if bo1 not found + branch.at(i)->angle--; + branch.at(i-1)->angle++; + branch.sort(); + return branch.at(i-1); + } else + return branch.at(i); +} + +BranchObj* BranchObj::moveBranchDown(BranchObj* bo1) +{ + savePosInAngle(); + int i=branch.find(bo1); + int j; + if (branch.next()) + { + j = branch.at(); + branch.at(i)->angle++; + branch.at(j)->angle--; + branch.sort(); + return branch.at(j); + } else + return branch.at(i); +} + +void BranchObj::alignRelativeTo (QPoint ref) +{ +/* FIXME testing + if (!getHeading().isEmpty()) + cout << "BO::alignRelTo "<<getHeading()<<endl; + else + cout << "BO::alignRelTo ???"<<endl; + cout << " d="<<depth<<endl; +*/ + int th = bboxTotal.height(); + + // If I am the mapcenter or a mainbranch, reposition heading + if (depth<2) + { + move (absPos.x(),absPos.y()); + if (depth==1) + { + // Calc angle to mapCenter if I am a mainbranch + // needed for reordering the mainbranches clockwise + // around mapcenter + angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), + (int)(y() - parObj->getChildPos().y() ) ) ); + } + } + else + { + // Align myself depending on orientation and parent, but + // only if I am not the mainbranch or mapcenter itself + switch (orientation) + { + case OrientLeftOfCenter: + move (ref.x()-bbox.width(), ref.y() + (th-bbox.height())/2 ); + break; + case OrientRightOfCenter: + move (ref.x(), ref.y() + (th-bbox.height())/2 ); + break; + default: + cout <<"LMO::alignRelativeTo: oops, no orientation given...\n"; + break; + } + } + + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next() ) + fio->reposition(); + + if (scrolled) return; + + // Set reference point for alignment of childs + QPoint ref2; + if (orientation==OrientLeftOfCenter) + ref2.setX(childPos.x() - linkwidth); + else + ref2.setX(childPos.x() + linkwidth); + + if (depth==1) + ref2.setY(absPos.y()-(bboxTotal.height()-bbox.height())/2); + else + ref2.setY(ref.y() ); + + // Align the childs depending on reference point + BranchObj *b; + for (b=branch.first(); b; b=branch.next() ) + { + b->alignRelativeTo (ref2); + ref2.setY(ref2.y() + b->getBBoxSizeWithChilds().height() ); + } +} + + +void BranchObj::reposition() +{ +/* FIXME testing + if (!getHeading().isEmpty()) + cout << "BO::reposition "<<getHeading()<<endl; + else + cout << "BO::reposition ???"<<endl; +*/ + if (depth==0) + { + // only calculate the sizes once. If the deepest LMO + // changes its height, + // all upper LMOs have to change, too. + calcBBoxSizeWithChilds(); + alignRelativeTo ( QPoint (absPos.x(), + absPos.y()-(bboxTotal.height()-bbox.height())/2) ); + branch.sort(); + } else + { + // This is only important for moving branches: + // For editing a branch it isn't called... + alignRelativeTo ( QPoint (absPos.x(), + absPos.y()-(bboxTotal.height()-bbox.height())/2) ); + } +} + + +QRect BranchObj::getTotalBBox() +{ + QRect r=bbox; + + if (scrolled) return r; + + BranchObj* b; + for (b=branch.first();b ;b=branch.next() ) + r=addBBox(b->getTotalBBox(),r); + + FloatImageObj* fio; + for (fio=floatimage.first();fio ;fio=floatimage.next() ) + r=addBBox(fio->getTotalBBox(),r); + + return r; +} + +QRect BranchObj::getBBoxSizeWithChilds() +{ + return bboxTotal; +} + +void BranchObj::calcBBoxSizeWithChilds() +{ + // This is called only from reposition and + // and only for mapcenter. So it won't be + // called more than once for a single user + // action + + // Calculate size of LMO including all childs (to align them later) + + bboxTotal.setX(bbox.x() ); + bboxTotal.setY(bbox.y() ); + + // if branch is scrolled, ignore childs, but still consider floatimages + if (scrolled) + { + bboxTotal.setWidth (bbox.width()); + bboxTotal.setHeight(bbox.height()); + return; + } + + QRect r(0,0,0,0); + QRect br; + // Now calculate recursivly + // sum of heights + // maximum of widths + // minimum of y + BranchObj* b; + for (b=branch.first();b ;b=branch.next() ) + { + b->calcBBoxSizeWithChilds(); + br=b->getBBoxSizeWithChilds(); + r.setWidth( max (br.width(), r.width() )); + r.setHeight(br.height() + r.height() ); + if (br.y()<bboxTotal.y()) bboxTotal.setY(br.y()); + } + // Add myself and also + // add width of link to sum if necessary + if (branch.isEmpty()) + bboxTotal.setWidth (bbox.width() + r.width() ); + else + bboxTotal.setWidth (bbox.width() + r.width() + linkwidth); + bboxTotal.setHeight(max (r.height(), bbox.height() ) ); +// frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) ); +} + +void BranchObj::select() +{ + LinkableMapObj::select(); + // Tell parent that I am selected now: + BranchObj* po=(BranchObj*)(parObj); + if (po) // TODO Try to get rid of this cast... + po->setLastSelectedBranch(this); + + // temporary unscroll, if we have scrolled parents somewhere + if (parObj) ((BranchObj*)(parObj))->tmpUnscroll(); + + // set Text in Editor + textEditor->setText(note.getNote() ); + textEditor->setFilename(note.getFilenameHint() ); + textEditor->setFontHint (note.getFontHint() ); + connect (textEditor, SIGNAL (textHasChanged() ), this, SLOT (updateNoteFlag() ) ); + connect (textEditor, SIGNAL (fontSizeHasChanged() ), this, SLOT (updateNoteFlag() ) ); + + // Show URL and link in statusbar + QString status; + if (!url.isEmpty()) status+="URL: "+url+" "; + if (!vymLink.isEmpty()) status+="Link: "+vymLink; + if (!status.isEmpty()) mainWindow->statusMessage (status); + + // Update Toolbar + standardFlags->updateToolBar(); + + // Update Browserbutton + if (!url.isEmpty()) + actionEditOpenURL->setEnabled (true); + else + actionEditOpenURL->setEnabled (false); + + // Update actions in mapeditor + mapEditor->updateActions(); +} + +void BranchObj::unselect() +{ + LinkableMapObj::unselect(); + // Delete any messages like vymLink in StatusBar + mainWindow->statusMessage (""); + + // save note from editor and set flag + // text is done by updateNoteFlag(), just save + // filename here + note.setFilenameHint (textEditor->getFilename()); + + // reset temporary unscroll, if we have scrolled parents somewhere + if (parObj) ((BranchObj*)(parObj))->resetTmpUnscroll(); + + // Disconnect textEditor from this LMO + disconnect( textEditor, SIGNAL(textHasChanged()), 0, 0 ); + disconnect( textEditor, SIGNAL (fontSizeHasChanged()),0,0 ); + + // Erase content of editor + textEditor->setInactive(); + + // unselect all buttons in toolbar + standardFlagsDefault->updateToolBar(); +} + +QString BranchObj::getSelectString() +{ + QString s; + if (parObj) + { + if (parObj->getDepth()==0) + s= "bo:" + QString("%1").arg(getNum()); + else + s= ((BranchObj*)(parObj))->getSelectString() + ",bo:" + QString("%1").arg(getNum()); + } else + { + s="mc:"; + } + + return s; +} + diff -r 000000000000 -r 7a96bd401351 branchobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/branchobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,113 @@ +#ifndef BRANCHOBJ_H +#define BRANCHOBJ_H + +#include "floatimageobj.h" +#include "linkablemapobj.h" +#include "ornamentedobj.h" + +class BranchObjPtrList : public QPtrList<BranchObj> +{ + virtual int compareItems (QPtrCollection::Item i, QPtrCollection::Item j); +}; + +///////////////////////////////////////////////////////////////////////////// +class BranchObj:public OrnamentedObj { +public: + BranchObj (); + BranchObj (QCanvas*); + BranchObj (QCanvas*, LinkableMapObj* parent); + ~BranchObj (); + bool operator< ( const BranchObj & ); + bool operator== ( const BranchObj & ); + virtual void init (); + virtual void copy (BranchObj*); + void clear(); + virtual int getNum(); // return number of this in parent + virtual int getNum(BranchObj*); // return number of this in parent + virtual int getFloatImageNum(FloatImageObj*); + virtual int countBranches(); + virtual int countFloatImages(); + virtual void setParObjTmp (LinkableMapObj*,QPoint,int);// Only for moving Obj around + virtual void unsetParObjTmp(); // reuse original ParObj + + virtual void unScroll(); + virtual void toggleScroll(); // scroll or unscroll + virtual bool isScrolled(); // returns scroll state + virtual bool hasScrolledParent(BranchObj*); // true, if any of the parents is scrolled + virtual void tmpUnscroll(); // unscroll scrolled parents temporary e.g. during "find" process + virtual void resetTmpUnscroll(); // scroll all tmp scrolled parents again e.g. when unselecting + + virtual void setVisibility(bool,int); // set visibility + virtual void setVisibility(bool); // set vis. for w + virtual void setLinkColor(); // set the color of link + virtual void setColor(QColor,bool); // set the color of heading + + + BranchObj* first (); // set Iterator to first LMO + BranchObj* next (); // find next LMO after given one + BranchObj* getLastIterator(); // to interrupt and resume next iteration + void setLastIterator (BranchObj*); // needed by next() + + virtual void move (double x,double y); + virtual void move (QPoint); + virtual void moveBy (double x,double y); + virtual void moveBy (QPoint); + virtual void positionBBox(); + virtual void calcBBoxSize(); + virtual LinkableMapObj* findMapObj(QPoint,LinkableMapObj*); // find MapObj + virtual void setHeading (QString); + virtual void setURL (QString); + virtual QString getURL (); + virtual void setVymLink (QString); + virtual QString getVymLink (); + virtual QString saveToDir (const QString&,const QString&, const QPoint&);// Save data recursivly to tempdir + virtual LinkableMapObj* addFloatImage(); + virtual LinkableMapObj* addFloatImage(FloatImageObj*); + virtual void removeFloatImage(FloatImageObj*); + virtual FloatImageObj* getFirstFloatImage(); + virtual FloatImageObj* getLastFloatImage(); + virtual FloatImageObj* getFloatImageNum(const uint &); +protected: + virtual void savePosInAngle(); // write pos in angle for resorting +public: + virtual BranchObj* addBranch(); + virtual BranchObj* addBranch(BranchObj*); // makes deep copy of BranchObj + virtual BranchObj* insertBranch(int); + virtual BranchObj* insertBranch(BranchObj*,int); + virtual void removeBranch(BranchObj*); + virtual void setLastSelectedBranch(BranchObj*); + virtual BranchObj* getLastSelectedBranch(); + virtual BranchObj* getFirstBranch(); + virtual BranchObj* getLastBranch(); + virtual BranchObj* getBranchNum(const uint &); + virtual BranchObj* moveBranchUp(BranchObj*); + virtual BranchObj* moveBranchDown(BranchObj*); + + virtual void alignRelativeTo(const QPoint ); + virtual void reposition(); + + virtual QRect getTotalBBox(); // return BBox including childs + virtual QRect getBBoxSizeWithChilds(); // return size of BBox including childs + virtual void calcBBoxSizeWithChilds(); // calc size of BBox including childs recursivly + + virtual void select(); + virtual void unselect(); + virtual QString getSelectString(); + +protected: + static BranchObj* itLast; // iterator for first(), next() + BranchObjPtrList branch; // all child branches + QPtrList<FloatImageObj> floatimage; // child images +public: + float angle; // used in mainbranch to reorder mainbranches +protected: + int lastSelectedBranch; // for going deeper into tree + bool scrolled; // true if all childs are scrolled and thus invisible + bool tmpUnscrolled; // can only be true (temporary) for a scrolled subtree + QString url; // url to external doc + QString vymLink; // path to another map +}; + + +#endif + diff -r 000000000000 -r 7a96bd401351 doc/vym.pdf Binary file doc/vym.pdf has changed diff -r 000000000000 -r 7a96bd401351 exporthtmldialog.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporthtmldialog.ui Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,321 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>ExportHTMLDialog</class> +<author>Uwe Drechsel</author> +<widget class="QDialog"> + <property name="name"> + <cstring>ExportHTMLDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>364</width> + <height>346</height> + </rect> + </property> + <property name="caption"> + <string>Export HTML</string> + </property> + <property name="modal"> + <bool>false</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout33</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Directory:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit1</cstring> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browseButton</cstring> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>buttonGroup2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>230</height> + </size> + </property> + <property name="title"> + <string>Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox4</cstring> + </property> + <property name="text"> + <string>Include image of map</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox5_2</cstring> + </property> + <property name="text"> + <string>create image only</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox5</cstring> + </property> + <property name="text"> + <string>use WIKI style</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox4_2</cstring> + </property> + <property name="text"> + <string>use heading for URLs (instead of link target)</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox6</cstring> + </property> + <property name="text"> + <string>use image of earth to mark URLs in text</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox7</cstring> + </property> + <property name="text"> + <string>use default CSS file</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>checkBox3</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>show output of external scripts</string> + </property> + </widget> + </vbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>60</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton4</cstring> + </property> + <property name="text"> + <string>Export</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton5</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>pushButton5</sender> + <signal>pressed()</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>reject()</slot> + </connection> + <connection> + <sender>pushButton4</sender> + <signal>clicked()</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>browseButton</sender> + <signal>pressed()</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>browseDirectory()</slot> + </connection> + <connection> + <sender>checkBox4</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>includeImage(bool)</slot> + </connection> + <connection> + <sender>checkBox5</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>useWIKIpressed(bool)</slot> + </connection> + <connection> + <sender>lineEdit1</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>dirChanged()</slot> + </connection> + <connection> + <sender>checkBox3</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>showOut(bool)</slot> + </connection> + <connection> + <sender>checkBox4_2</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>useHeadingPressed(bool)</slot> + </connection> + <connection> + <sender>checkBox5_2</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>imgOnly(bool)</slot> + </connection> + <connection> + <sender>checkBox6</sender> + <signal>toggled(bool)</signal> + <receiver>ExportHTMLDialog</receiver> + <slot>useURLImagePressed(bool)</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in declaration">showtextdialog.h</include> + <include location="global" impldecl="in declaration">qprocess.h</include> + <include location="global" impldecl="in implementation">iostream</include> + <include location="local" impldecl="in implementation">settings.h</include> + <include location="global" impldecl="in implementation">qfiledialog.h</include> + <include location="global" impldecl="in implementation">qmessagebox.h</include> + <include location="local" impldecl="in implementation">misc.h</include> + <include location="local" impldecl="in implementation">icons/flag-url.xpm</include> + <include location="local" impldecl="in implementation">exporthtmldialog.ui.h</include> +</includes> +<variables> + <variable>QString css;</variable> + <variable>QString xsl;</variable> + <variable>QString scriptpath;</variable> + <variable>QString stylepath;</variable> + <variable>QString dir;</variable> + <variable>bool image;</variable> + <variable>bool wikistyle;</variable> + <variable>QString script;</variable> + <variable>bool showOutput;</variable> + <variable>QProcess *proc;</variable> + <variable>ShowTextDialog *dia;</variable> + <variable>bool imageOnly;</variable> + <variable>bool useHeading;</variable> + <variable>bool useURLImage;</variable> +</variables> +<slots> + <slot>browseDirectory()</slot> + <slot>useWIKIpressed( bool b )</slot> + <slot>includeImage( bool b )</slot> + <slot>imgOnly( bool b )</slot> + <slot>useHeadingPressed( bool b )</slot> + <slot>useURLImagePressed( bool b )</slot> + <slot>showOut( bool b )</slot> + <slot>dirChanged()</slot> + <slot>doExport( const QString & mapname )</slot> + <slot returnType="QString">getDir()</slot> + <slot>readOutput()</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function access="private" specifier="non virtual">destroy()</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff -r 000000000000 -r 7a96bd401351 exporthtmldialog.ui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exporthtmldialog.ui.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,218 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + + +extern Settings settings; + +void ExportHTMLDialog::init() +{ + dir=settings.readEntry ("/vym/export/html/dir","" ); + lineEdit1->setText(dir); + + if ( settings.readEntry ("/vym/export/html/image","yes")=="yes") + image=true; + else + image=false; + checkBox4->setChecked(image); + + if ( settings.readEntry ("/vym/export/html/imageOnly","no")=="yes") + imageOnly=true; + else + imageOnly=false; + checkBox5_2->setChecked(imageOnly); + + if ( settings.readEntry ("/vym/export/html/wiki","no")=="yes") + wikistyle=true; + else + wikistyle=false; + checkBox5->setChecked(wikistyle); + + if ( settings.readEntry ("/vym/export/html/useHeading","no")=="yes") + useHeading=true; + else + useHeading=false; + checkBox4_2->setChecked(useHeading); + + if ( settings.readEntry ("/vym/export/html/useURLImage","yes")=="yes") + useURLImage=true; + else + useURLImage=false; + checkBox6->setChecked(useURLImage); + + if ( settings.readEntry ("/vym/export/html/showOutput","no")=="yes") + showOutput=true; + else + showOutput=false; + checkBox3->setChecked(showOutput); + + stylepath=settings.readEntry + ("/vym/export/html/styles","styles"); + scriptpath=settings.readEntry + ("/vym/export/html/scripts","scripts"); + xsl=settings.readEntry + ("/vym/export/html/xsl","vym2html.xsl"); + css=settings.readEntry + ("/vym/export/html/css","vym.css"); + script=settings.readEntry + ("/vym/export/html/script","vym2html.sh"); + + proc = new QProcess( this ); + connect( proc, SIGNAL(readyReadStdout()), + this, SLOT(readOutput()) ); + + dia=new ShowTextDialog (); +} + +void ExportHTMLDialog::destroy() +{ + delete (proc); + delete (dia); +} + +void ExportHTMLDialog::browseDirectory() +{ + QFileDialog fd( this, tr("VYM - Export HTML to directory")); + fd.setMode (QFileDialog::DirectoryOnly); + fd.setCaption(tr("VYM - Export HTML to directory")); + fd.setModal (true); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + dir=fd.selectedFile(); + lineEdit1->setText (dir ); + } +} + +void ExportHTMLDialog::useWIKIpressed(bool b) +{ + wikistyle=b; +} + +void ExportHTMLDialog::includeImage(bool b) +{ + image=b; +} + +void ExportHTMLDialog::imgOnly(bool b) +{ + imageOnly=b; +} + +void ExportHTMLDialog::useHeadingPressed(bool b) +{ + useHeading=b; +} + +void ExportHTMLDialog::useURLImagePressed(bool b) +{ + useURLImage=b; +} + +void ExportHTMLDialog::showOut(bool b) +{ + showOutput=b; +} + +void ExportHTMLDialog::dirChanged() +{ + dir=lineEdit1->text(); +} + + + + +void ExportHTMLDialog::doExport (const QString &mapname) +{ + // Save options to settings file + // (but don't save at destructor, which + // is called for "cancel", too) + settings.writeEntry ("/vym/export/html/dir",lineEdit1->text() ); + + if (wikistyle) + settings.writeEntry ("/vym/export/html/wiki","yes"); + else + settings.writeEntry ("/vym/export/html/wiki","no"); + + if (image) + settings.writeEntry ("/vym/export/html/image","yes"); + else + settings.writeEntry ("/vym/export/html/image","no"); + + if (imageOnly) + settings.writeEntry ("/vym/export/html/imageOnly","yes"); + else + settings.writeEntry ("/vym/export/html/imageOnly","no"); + + if (useHeading) + settings.writeEntry ("/vym/export/html/useHeading","yes"); + else + settings.writeEntry ("/vym/export/html/useHeading","no"); + + if (showOutput) + settings.writeEntry ("/vym/export/html/showOutput","yes"); + else + settings.writeEntry ("/vym/export/html/showOutput","no"); + + settings.writeEntry + ("/vym/export/html/styles",stylepath); + settings.writeEntry + ("/vym/export/html/scripts",scriptpath); + settings.writeEntry + ("/vym/export/html/xsl",xsl); + settings.writeEntry + ("/vym/export/html/css",css); + settings.writeEntry + ("/vym/export/html/script",script); + + proc->addArgument (scriptpath + "/" + script ); + proc->addArgument(dir + maskPath(mapname) + ".xml"); + proc->addArgument("-sp=" + stylepath +"/" + xsl ); + proc->addArgument("-css=" + css ); + if (image) proc->addArgument("-image" ); + if (wikistyle) proc->addArgument("-wikistyle" ); + if (useHeading) proc->addArgument("-useURLHeading" ); + if (useURLImage) + { + proc->addArgument("-useURLImage" ); + QPixmap pm (flag_url_xpm); + pm.save (dir + "/flags/url.png","PNG"); + } + + dia->append ("vym is executing: " + proc->arguments().join(" ") ); + if ( !proc->start() ) + { + // error handling + dia->show(); + QString s; + QStringList list = proc->arguments(); + QStringList::Iterator it = list.begin(); + while( it != list.end() ) + { + s+= ( *it ) + "\n"; + ++it; + } + QMessageBox::critical(0, tr("Critcal export error"),"Couldn't start script to export:\n"+s); + } else + if (showOutput) dia->exec(); + + +} + + +QString ExportHTMLDialog::getDir() +{ + return dir; +} + + +void ExportHTMLDialog::readOutput() +{ + dia->append (proc->readStdout() ); +} diff -r 000000000000 -r 7a96bd401351 exports.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exports.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,132 @@ +#include "exports.h" + +#include "linkablemapobj.h" + + +Export::Export() +{ + indentPerDepth=" "; +} + +bool Export::setOutputDir(QString dirname) +{ + outdir.setPath (dirname); + if ( outdir.exists() ) + { + // FIXME + // ask for confirmation + // then delete outdir + return true; + } else + { + // try to create directory + //return outdir.mkdir (outdir.absPath()); + // FIXME + return true; + } +} + +void Export::setPath (const QString &p) +{ + filepath=p; +} + +void Export::setMapCenter(MapCenterObj *mc) +{ + mapCenter=mc; +} + +void Export::exportMap() +{ + QFile file (filepath); + if ( !file.open( IO_WriteOnly ) ) + { + // FIXME + cout << "Export::exportMap couldn't open "<<filepath<<endl; + return; + } + QTextStream ts( &file ); // use LANG decoding here... + + // Main loop over all branches + QString s; + QString actIndent(""); + int i; + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + // Make indentstring + for (i=0;i<bo->getDepth();i++) actIndent+= indentPerDepth; + + // Write heading + // write (actIndent + getSectionString(bo) + bo->getHeading()+ "\n"); + if (bo->getDepth()==1) + ts << (getSectionString(bo) + bo->getHeading()+ "\n"); + else + ts << (actIndent + " - " + bo->getHeading()+ "\n"); + + // If necessary, write note + if (!bo->getNote().isEmpty()) + { + ts << ("-------------------Begin of Note-----------------\n"); + ts << (bo->getNote()); + ts << ("\n"); + ts << ("-------------------End of Note-------------------\n"); + } + + bo=bo->next(); + actIndent=""; + } + file.close(); +} + +QString Export::getSectionString(BranchObj *bostart) +{ + QString r; + BranchObj *bo=bostart; + int depth=bo->getDepth(); + while (depth>0) + { + r=QString("%1").arg(1+bo->getNum(),0,10)+"." + r; + bo=(BranchObj*)(bo->getParObj()); + depth=bo->getDepth(); + } + if (r.isEmpty()) + return r; + else + return r + " "; +} + +void Export::exportAsHTML() +{ + // FIXME just testing... + // Main loop over all branches + QString s; + QString actIndent(""); + int i; + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + // Make indentstring + for (i=0;i<bo->getDepth();i++) actIndent+= indentPerDepth; + + // Write heading + write (actIndent + getSectionString(bo) + bo->getHeading()+ "\n"); + + // If necessary, write note + if (!bo->getNote().isEmpty()) + { + write (bo->getNote()); + } + + bo=bo->next(); + actIndent=""; + } +} + +void Export::write(QString s) +{ + cout << s; +} + diff -r 000000000000 -r 7a96bd401351 exports.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exports.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,34 @@ +#ifndef EXPORTS_H +#define EXPORTS_H + +#include <qdir.h> +#include <qstring.h> +#include <iostream> + +#include "mapcenterobj.h" + +using namespace std; + +///////////////////////////////////////////////////////////////////////////// +class Export +{ +public: + Export(); + bool setOutputDir (QString); + void setPath(const QString &); + void setMapCenter (MapCenterObj*); + void setIndentPerDepth (QString); + void exportMap(); + void exportAsHTML(); +protected: + QString getSectionString (BranchObj*); + void write (QString); + +private: + QDir outdir; + QString filepath; + MapCenterObj *mapCenter; + QString indentPerDepth; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 exportxhtmldialog.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exportxhtmldialog.ui Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,555 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>ExportXHTMLDialog</class> +<widget class="QDialog"> + <property name="name"> + <cstring>ExportXHTMLDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>582</width> + <height>599</height> + </rect> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>130</height> + </size> + </property> + <property name="caption"> + <string>Export XHTML</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout33</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Export to directory:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEditDir</cstring> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browseExportDirButton</cstring> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>buttonGroup2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>160</height> + </size> + </property> + <property name="title"> + <string>Options</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>imageButton</cstring> + </property> + <property name="text"> + <string>Include image</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>textColorButton</cstring> + </property> + <property name="text"> + <string>Colored headings in text</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>saveSettingsInMapButton</cstring> + </property> + <property name="text"> + <string>Save settings in map</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>warningsButton</cstring> + </property> + <property name="text"> + <string>showWarnings e.g. if directory is not empty</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>outputButton</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>show output of external scripts</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QButtonGroup"> + <property name="name"> + <cstring>buttonGroup2_2</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>3</hsizetype> + <vsizetype>3</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="title"> + <string>Stylesheets</string> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <property name="geometry"> + <rect> + <x>10</x> + <y>30</y> + <width>540</width> + <height>84</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_2</cstring> + </property> + <property name="text"> + <string>CSS:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEditCSS</cstring> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browseCSSButton</cstring> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout6</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>XSL:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEditXSL</cstring> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browseXSLButton</cstring> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </widget> + <widget class="QGroupBox"> + <property name="name"> + <cstring>groupBox1</cstring> + </property> + <property name="title"> + <string>Scripts</string> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_3</cstring> + </property> + <property name="geometry"> + <rect> + <x>12</x> + <y>22</y> + <width>110</width> + <height>36</height> + </rect> + </property> + <property name="text"> + <string>Before export:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEditPreScript</cstring> + </property> + <property name="geometry"> + <rect> + <x>128</x> + <y>26</y> + <width>322</width> + <height>28</height> + </rect> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browsePreExportButton</cstring> + </property> + <property name="geometry"> + <rect> + <x>456</x> + <y>22</y> + <width>94</width> + <height>36</height> + </rect> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="geometry"> + <rect> + <x>11</x> + <y>61</y> + <width>99</width> + <height>36</height> + </rect> + </property> + <property name="text"> + <string>After Export:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEditPostScript</cstring> + </property> + <property name="geometry"> + <rect> + <x>116</x> + <y>65</y> + <width>333</width> + <height>28</height> + </rect> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>browsePostExportButton</cstring> + </property> + <property name="geometry"> + <rect> + <x>455</x> + <y>61</y> + <width>94</width> + <height>36</height> + </rect> + </property> + <property name="text"> + <string>Browse</string> + </property> + </widget> + </widget> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>31</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout17</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>61</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>exportButton</cstring> + </property> + <property name="text"> + <string>Export</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>cancelButton</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>outputButton</sender> + <signal>toggled(bool)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>outputButtonPressed(bool)</slot> + </connection> + <connection> + <sender>exportButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>cancelButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>close()</slot> + </connection> + <connection> + <sender>browseExportDirButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>browseDirectoryPressed()</slot> + </connection> + <connection> + <sender>browseXSLButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>browseXSLPressed()</slot> + </connection> + <connection> + <sender>browseCSSButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>browseCSSPressed()</slot> + </connection> + <connection> + <sender>imageButton</sender> + <signal>toggled(bool)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>imageButtonPressed(bool)</slot> + </connection> + <connection> + <sender>textColorButton</sender> + <signal>toggled(bool)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>textcolorButtonPressed(bool)</slot> + </connection> + <connection> + <sender>lineEditDir</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>dirChanged()</slot> + </connection> + <connection> + <sender>lineEditCSS</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>cssChanged()</slot> + </connection> + <connection> + <sender>lineEditXSL</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>xslChanged()</slot> + </connection> + <connection> + <sender>browsePreExportButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>browsePreExportButtonPressed()</slot> + </connection> + <connection> + <sender>browsePostExportButton</sender> + <signal>pressed()</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>browsePostExportButtonPressed()</slot> + </connection> + <connection> + <sender>lineEditPreScript</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>prescriptChanged()</slot> + </connection> + <connection> + <sender>lineEditPostScript</sender> + <signal>textChanged(const QString&)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>postscriptChanged()</slot> + </connection> + <connection> + <sender>warningsButton</sender> + <signal>toggled(bool)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>warningsButtonPressed(bool)</slot> + </connection> + <connection> + <sender>saveSettingsInMapButton</sender> + <signal>toggled(bool)</signal> + <receiver>ExportXHTMLDialog</receiver> + <slot>saveSettingsInMapButtonPressed(bool)</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in declaration">process.h</include> + <include location="local" impldecl="in declaration">showtextdialog.h</include> + <include location="global" impldecl="in implementation">qfiledialog.h</include> + <include location="global" impldecl="in implementation">qmessagebox.h</include> + <include location="local" impldecl="in implementation">settings.h</include> + <include location="local" impldecl="in implementation">icons/flag-url.xpm</include> + <include location="local" impldecl="in implementation">exportxhtmldialog.ui.h</include> +</includes> +<variables> + <variable>bool useTextColor;</variable> + <variable>bool showWarnings;</variable> + <variable>QString xsl;</variable> + <variable>QString css;</variable> + <variable>bool useImage;</variable> + <variable>bool showOutput;</variable> + <variable>Process *xsltProc;</variable> + <variable>ShowTextDialog *dia;</variable> + <variable>QString dir;</variable> + <variable>QString xsltprocessor;</variable> + <variable>QString filepath;</variable> + <variable>QString prescript;</variable> + <variable>QString postscript;</variable> + <variable>bool settingsChanged;</variable> + <variable>QString mapname;</variable> + <variable>bool saveSettingsInMap;</variable> +</variables> +<slots> + <slot>readSettings()</slot> + <slot>dirChanged()</slot> + <slot>browseDirectoryPressed()</slot> + <slot>imageButtonPressed( bool b )</slot> + <slot>textcolorButtonPressed( bool b )</slot> + <slot>saveSettingsInMapButtonPressed( bool b )</slot> + <slot>warningsButtonPressed( bool b )</slot> + <slot>outputButtonPressed( bool b )</slot> + <slot>cssChanged()</slot> + <slot>browseCSSPressed()</slot> + <slot>xslChanged()</slot> + <slot>prescriptChanged()</slot> + <slot>browseXSLPressed()</slot> + <slot>postscriptChanged()</slot> + <slot>browsePreExportButtonPressed()</slot> + <slot>browsePostExportButtonPressed()</slot> + <slot>doExport( const QString & mapname )</slot> + <slot>setFilePath( const QString & s )</slot> + <slot>setMapName( const QString & s )</slot> +</slots> +<functions> + <function access="private" specifier="non virtual">init()</function> + <function access="private" specifier="non virtual">destroy()</function> + <function returnType="QString">getDir()</function> + <function returnType="bool">warnings()</function> + <function returnType="bool">hasChanged()</function> + <function access="private" specifier="non virtual">runScript( QString spath, QString fpath )</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff -r 000000000000 -r 7a96bd401351 exportxhtmldialog.ui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/exportxhtmldialog.ui.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,412 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + + +extern Settings settings; + +void ExportXHTMLDialog::init() +{ + dia=new ShowTextDialog (); + xsltprocessor="xsltproc"; + filepath=""; + settingsChanged=false; +} + +void ExportXHTMLDialog::readSettings() +{ + + dir=settings.readLocalEntry (filepath,"/vym/export/xhtml/exportDir","./" ); + lineEditDir->setText(dir); + + + if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/useImage","yes")=="yes") + useImage=true; + else + useImage=false; + imageButton->setChecked(useImage); + + if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/useTextColor","no")=="yes") + useTextColor=true; + else + useTextColor=false; + textColorButton->setChecked(useTextColor); + +/* FIXME this was used in old html export, is not yet in new stylesheet + if ( settings.readEntry ("/vym/export/html/useHeading","no")=="yes") + useHeading=true; + else + useHeading=false; + checkBox4_2->setChecked(useHeading); +*/ + + if ( settings.readLocalEntry (filepath,"/vym/export/xhtml/saveSettingsInMap","no")=="yes") + saveSettingsInMap=true; + else + saveSettingsInMap=false; + saveSettingsInMapButton->setChecked(saveSettingsInMap); + + if ( settings.readEntry ("/vym/export/xhtml/showWarnings","yes")=="yes") + showWarnings=true; + else + showWarnings=false; + warningsButton->setChecked(showWarnings); + + if ( settings.readEntry ("/vym/export/xhtml/showOutput","no")=="yes") + showOutput=true; + else + showOutput=false; + outputButton->setChecked(showOutput); + + xsl=settings.readLocalEntry + (filepath,"/vym/export/xhtml/xsl","/usr/share/vym/styles/vym2xhtml.xsl"); + lineEditXSL->setText(xsl); + + css=settings.readLocalEntry + (filepath,"/vym/export/xhtml/css","/usr/share/vym/styles/vym.css"); + lineEditCSS->setText(css); + + prescript=settings.readLocalEntry + (filepath,"/vym/export/xhtml/prescript",""); + lineEditPreScript->setText (prescript); + + postscript=settings.readLocalEntry + (filepath,"/vym/export/xhtml/postscript",""); + lineEditPostScript->setText (postscript); + + if (!prescript.isEmpty() || !postscript.isEmpty()) + { + QMessageBox::warning( 0, tr( "Warning" ),tr( + "The settings saved in the map " + "would like to run scripts:\n\n") + + prescript +" "+postscript +"\n\n"+ + tr("Please check, if you really\n" + "want to allow this in your system!")); + + } +} + +void ExportXHTMLDialog::destroy() +{ + delete (dia); +} + +void ExportXHTMLDialog::dirChanged() +{ + dir=lineEditDir->text(); + if (dir.right(1)!="/") + dir+="/"; + settingsChanged=true; +} + +void ExportXHTMLDialog::browseDirectoryPressed() +{ + QFileDialog fd( this, tr("VYM - Export HTML to directory")); + fd.setMode (QFileDialog::DirectoryOnly); + fd.setCaption(tr("VYM - Export HTML to directory")); + fd.setModal (true); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + dir=fd.selectedFile(); + lineEditDir->setText (dir ); + settingsChanged=true; + } +} + +void ExportXHTMLDialog::imageButtonPressed(bool b) +{ + useImage=b; + settingsChanged=true; +} + +void ExportXHTMLDialog::textcolorButtonPressed(bool b) +{ + useTextColor=b; + settingsChanged=true; +} + +void ExportXHTMLDialog::saveSettingsInMapButtonPressed(bool b) +{ + saveSettingsInMap=b; + settingsChanged=true; +} + +void ExportXHTMLDialog::warningsButtonPressed(bool b) +{ + showWarnings=b; + settingsChanged=true; +} + + +void ExportXHTMLDialog::outputButtonPressed(bool b) +{ + showOutput=b; + settingsChanged=true; +} + +void ExportXHTMLDialog::cssChanged() +{ + css=lineEditCSS->text(); + settingsChanged=true; +} + +void ExportXHTMLDialog::browseCSSPressed() +{ + QFileDialog fd( this, tr("VYM - Path to CSS file")); + fd.setModal (true); + fd.addFilter ("Cascading Stylesheet (*.css)"); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + css=fd.selectedFile(); + lineEditCSS->setText (css ); + settingsChanged=true; + } +} + +void ExportXHTMLDialog::xslChanged() +{ + xsl=lineEditXSL->text(); + settingsChanged=true; +} + +void ExportXHTMLDialog::prescriptChanged() +{ + prescript=lineEditPreScript->text(); + settingsChanged=true; +} + +void ExportXHTMLDialog::browseXSLPressed() +{ + QFileDialog fd( this, tr("VYM - Path to XSL file")); + fd.setModal (true); + fd.addFilter ("Extensible Styleshee Language (*.xsl)"); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + xsl=fd.selectedFile(); + lineEditXSL->setText (xsl ); + settingsChanged=true; + } +} + +void ExportXHTMLDialog::postscriptChanged() +{ + postscript=lineEditPostScript->text(); + settingsChanged=true; +} + +void ExportXHTMLDialog::browsePreExportButtonPressed() +{ + QFileDialog fd( this, tr("VYM - Path to pre export script")); + fd.setModal (true); + fd.addFilter ("Scripts (*.sh *.pl *.py *.php)"); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + prescript=fd.selectedFile(); + lineEditPreScript->setText (prescript ); + settingsChanged=true; + } + +} + +void ExportXHTMLDialog::browsePostExportButtonPressed() +{ + QFileDialog fd( this, tr("VYM - Path to post export script")); + fd.setModal (true); + fd.addFilter ("Scripts (*.sh *.pl *.py *.php)"); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + { + postscript=fd.selectedFile(); + lineEditPostScript->setText (postscript ); + settingsChanged=true; + } +} + + +void ExportXHTMLDialog::doExport (const QString &mapname) +{ + // Save options to settings file + // (but don't save at destructor, which + // is called for "cancel", too) + settings.setLocalEntry (filepath,"/vym/export/xhtml/exportDir",dir); + + settings.setLocalEntry (filepath,"/vym/export/xhtml/prescript",prescript); + settings.setLocalEntry (filepath,"/vym/export/xhtml/postscript",postscript); + + if (useImage) + settings.setLocalEntry (filepath,"/vym/export/xhtml/useImage","yes"); + else + settings.setLocalEntry (filepath,"/vym/export/xhtml/useImage","no"); + + if (useTextColor) + settings.setLocalEntry (filepath,"/vym/export/xhtml/useTextColor","yes"); + else + settings.setLocalEntry (filepath,"/vym/export/xhtml/useTextColor","no"); + + if (showWarnings) + settings.writeEntry ("/vym/export/xhtml/showWarnings","yes"); + else + settings.writeEntry ("/vym/export/xhtml/showWarnings","no"); + + if (showOutput) + settings.writeEntry ("/vym/export/xhtml/showOutput","yes"); + else + settings.writeEntry ("/vym/export/xhtml/showOutput","no"); + + settings.setLocalEntry + (filepath,"/vym/export/xhtml/xsl",xsl); + settings.setLocalEntry + (filepath,"/vym/export/xhtml/css",css); + + //FIXME add option for url image (globe flag) here + if (true) + { + QPixmap pm (flag_url_xpm); + pm.save (dir + "/flags/url.png","PNG"); + } + + if (!saveSettingsInMap) + settings.clearLocal("/vym/export/xhtml"); + else + settings.setLocalEntry + (filepath,"/vym/export/xhtml/saveSettingsInMap","yes"); + + // Copy CSS file + QFile css_src (css); + QFile css_dst (dir+"vym.css"); + if (!css_src.open ( IO_ReadOnly)) + QMessageBox::warning( 0, tr( "Warning" ),css +tr(" could not be opened!")); + else + { + if (!css_dst.open( IO_WriteOnly)) + QMessageBox::warning( 0, tr( "Warning" ), dir+"vym.css" +tr(" could not be opened!")); + else + { + + QTextStream tsout( &css_dst); + QTextStream tsin ( &css_src); + QString s= tsin.read(); + tsout << s; + css_dst.close(); + } + css_src.close(); + } + + if (!prescript.isEmpty()) runScript (prescript,dir+mapname+".xml"); + + Process *xsltProc=new Process (); + xsltProc->clearArguments(); + xsltProc->addArgument (xsltprocessor); + if (useImage) + { + xsltProc->addArgument ("--stringparam"); + xsltProc->addArgument ("imagemap"); + xsltProc->addArgument ("images/"+mapname+".png"); + } + if (useTextColor) + { + xsltProc->addArgument ("--stringparam"); + xsltProc->addArgument ("use.textcolor"); + xsltProc->addArgument ("1"); + } + xsltProc->addArgument ("--stringparam"); + xsltProc->addArgument ("mapname"); + xsltProc->addArgument (mapname+".vym"); + + xsltProc->addArgument ("--output"); + xsltProc->addArgument (dir+mapname+".html"); + xsltProc->addArgument (xsl); + xsltProc->addArgument (dir+mapname+".xml"); + dia->append ("vym is executing: \n" + xsltProc->arguments().join(" ") ); + if (!xsltProc->start() ) + { + QMessageBox::critical( 0, tr( "Critical Error" ), + tr("Couldn't start ") + xsltprocessor ); + } else + { + xsltProc->waitFinished(); + if (!xsltProc->normalExit() ) + QMessageBox::critical( 0, tr( "Critical Error" ), + xsltprocessor +" " +tr("didn't exit normally") + + xsltProc->getErrout() ); + else + if (xsltProc->exitStatus()>0) showOutput=true; + + } + dia->append ("\n"); + dia->append (xsltProc->getErrout()); + dia->append (xsltProc->getStdout()); + + if (!postscript.isEmpty()) runScript (postscript,dir+mapname+".html"); + + if (showOutput) dia->exec(); +} + +void ExportXHTMLDialog::setFilePath(const QString &s) +{ + filepath=s; +} + +void ExportXHTMLDialog::setMapName(const QString &s) +{ + mapname=s; +} + +QString ExportXHTMLDialog::getDir() +{ + return dir; +} + +bool ExportXHTMLDialog::warnings() +{ + return showWarnings; +} + +bool ExportXHTMLDialog::hasChanged() +{ + return settingsChanged; +} + + +void ExportXHTMLDialog::runScript(QString spath, QString fpath) +{ + spath.replace ("%f",fpath); + QStringList args=QStringList::split (' ',spath,false); + + Process *scriptProc=new Process (); + scriptProc->clearArguments(); + scriptProc->setArguments (args); + dia->append ("vym is executing: \n" + scriptProc->arguments().join(" ") ); + if (!scriptProc->start() ) + { + QMessageBox::critical( 0, tr( "Critical Error" ), + tr("Couldn't start ") + spath ); + } else + { + scriptProc->waitFinished(); + if (!scriptProc->normalExit() ) + QMessageBox::critical( 0, tr( "Critical Error" ), + spath +" " +tr("didn't exit normally") + + scriptProc->getErrout() ); + else + if (scriptProc->exitStatus()>0) showOutput=true; + + } + dia->append ("\n"); + dia->append (scriptProc->getErrout()); + dia->append (scriptProc->getStdout()); +} diff -r 000000000000 -r 7a96bd401351 extrainfodialog.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extrainfodialog.ui Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,204 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>ExtraInfoDialog</class> +<author>Uwe Drechsel</author> +<widget class="QDialog"> + <property name="name"> + <cstring>ExtraInfoDialog</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>338</width> + <height>410</height> + </rect> + </property> + <property name="caption"> + <string>VYM - Info</string> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1_2</cstring> + </property> + <property name="text"> + <string>Map:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit7</cstring> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>225</red> + <green>225</green> + <blue>225</blue> + </color> + </property> + <property name="backgroundOrigin"> + <enum>WidgetOrigin</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Author:</string> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>lineEdit2</cstring> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Comment:</string> + </property> + </widget> + <widget class="QTextEdit"> + <property name="name"> + <cstring>textEdit4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>4</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>32767</width> + <height>76</height> + </size> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="text"> + <string>Statistics:</string> + </property> + </widget> + <widget class="QTextEdit"> + <property name="name"> + <cstring>textEdit4_2</cstring> + </property> + <property name="paletteBackgroundColor"> + <color> + <red>225</red> + <green>225</green> + <blue>225</blue> + </color> + </property> + <property name="font"> + <font> + <family>Courier</family> + <pointsize>12</pointsize> + </font> + </property> + <property name="textFormat"> + <enum>PlainText</enum> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout21</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer10</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>160</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton13</cstring> + </property> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton7</cstring> + </property> + <property name="text"> + <string>Close</string> + </property> + </widget> + </hbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>pushButton7</sender> + <signal>clicked()</signal> + <receiver>ExtraInfoDialog</receiver> + <slot>accept()</slot> + </connection> + <connection> + <sender>pushButton13</sender> + <signal>clicked()</signal> + <receiver>ExtraInfoDialog</receiver> + <slot>reject()</slot> + </connection> +</connections> +<tabstops> + <tabstop>lineEdit2</tabstop> + <tabstop>textEdit4</tabstop> + <tabstop>pushButton7</tabstop> + <tabstop>pushButton13</tabstop> + <tabstop>lineEdit7</tabstop> + <tabstop>textEdit4_2</tabstop> +</tabstops> +<includes> + <include location="global" impldecl="in implementation">qstring.h</include> + <include location="local" impldecl="in implementation">extrainfodialog.ui.h</include> +</includes> +<slots> + <slot>setMapName( const QString & s )</slot> + <slot>setComment( const QString & s )</slot> + <slot>setAuthor( const QString & s )</slot> +</slots> +<functions> + <function returnType="QString">getComment()</function> + <function returnType="QString">getAuthor()</function> + <function>setStats( const QString & s )</function> +</functions> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff -r 000000000000 -r 7a96bd401351 extrainfodialog.ui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extrainfodialog.ui.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,39 @@ +/**************************************************************************** +** ui.h extension file, included from the uic-generated form implementation. +** +** If you wish to add, delete or rename functions or slots use +** Qt Designer which will update this file, preserving your code. Create an +** init() function in place of a constructor, and a destroy() function in +** place of a destructor. +*****************************************************************************/ + +void ExtraInfoDialog::setMapName(const QString &s) +{ + lineEdit7->setText (s); +} + +void ExtraInfoDialog::setComment (const QString &s) +{ + textEdit4->setText (s); +} + +QString ExtraInfoDialog::getComment() +{ + return textEdit4->text(); +} + + +void ExtraInfoDialog::setAuthor(const QString &s) +{ + lineEdit2->setText (s); +} + +QString ExtraInfoDialog::getAuthor() +{ + return lineEdit2->text(); +} + +void ExtraInfoDialog::setStats(const QString &s) +{ + textEdit4_2->setText (s); +} diff -r 000000000000 -r 7a96bd401351 findwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/findwindow.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,85 @@ +#include <qlineedit.h> + +#include "findwindow.h" + + +FindWindow::FindWindow(QWidget* parent, const char* name, WFlags f) + : QGroupBox( 0, Horizontal, "Find", parent, name ) + +{ + setCaption ("VYM - Find Text"); + //resize (180,130); + move (130,130); + + setMargin( 100 ); + + QVBoxLayout* box = new QVBoxLayout( layout() ); + + QHBoxLayout *row1 = new QHBoxLayout( box ); + row1->setMargin( 10 ); + + // Create a Label + QLabel* label = new QLabel( "Text to find: ", this); + row1->addWidget( label ); + + // Create LineEdit (here QComboBox) + QHBoxLayout *row2 = new QHBoxLayout( box ); + row2->setMargin( 10 ); + findcombo = new QComboBox( true, this ); + findcombo->setMinimumWidth(150); + row2->addWidget( findcombo ); + connect ( findcombo, SIGNAL( highlighted(int) ), + this, SLOT( findPressed() ) ); + connect ( findcombo, SIGNAL( textChanged(const QString &) ), + this, SLOT( findTextChanged(const QString&) ) ); + //findcombo->insertItem( "Normal", -1 ); + + // Create Buttons + QHBoxLayout *row3 = new QHBoxLayout( box ); + row3->setMargin( 10 ); + clearbutton = new QPushButton (tr("Clear"),this); + connect ( clearbutton, SIGNAL( clicked() ), + findcombo, SLOT( clearEdit() ) ); + row3->addWidget (clearbutton); + + QSpacerItem *si1= new QSpacerItem (10,0,QSizePolicy::Minimum, QSizePolicy::Expanding ); + row3->addItem(si1); + + cancelbutton = new QPushButton (tr("Cancel"),this); + cancelbutton->setAccel (Key_Escape); + connect ( cancelbutton, SIGNAL( clicked() ), + this, SLOT( cancelPressed() ) ); + row3->addWidget (cancelbutton); + + QSpacerItem *si2= new QSpacerItem (10,0,QSizePolicy::Fixed, QSizePolicy::Fixed); + row3->addItem(si2); + + findbutton = new QPushButton (tr("Find"),this); + findbutton->setDefault (true); + connect ( findbutton, SIGNAL( clicked() ), + this, SLOT( findPressed() ) ); + row3->add(findbutton); + + findcombo->setFocus(); +} + +void FindWindow::popup() +{ + findcombo->lineEdit()->selectAll(); + show(); +} + +void FindWindow::cancelPressed() +{ + hide(); +} + +void FindWindow::findPressed() +{ + emit (findButton(findcombo->currentText() ) ); +} + +void FindWindow::findTextChanged(const QString&) +{ + emit (somethingChanged() ); +} diff -r 000000000000 -r 7a96bd401351 findwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/findwindow.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,38 @@ +#ifndef FINDWINDOW_H +#define FINDWINDOW_H + +#include <qmainwindow.h> +#include <qcombobox.h> +#include <qpushbutton.h> +#include <qgroupbox.h> +#include <qlayout.h> +#include <qlabel.h> + + +class FindWindow : public QGroupBox +{ + Q_OBJECT + +public: + FindWindow (QWidget* parent=0, const char* namme=0, WFlags f=0); + +public slots: + void popup(); + void cancelPressed(); + void findPressed(); + void findTextChanged(const QString&); + +signals: + void findButton(QString); // emit to mainwindow + void somethingChanged(); // emit to mainwindow + +private: + QGroupBox *findbox; + QComboBox *findcombo; + QPushButton *clearbutton; + QPushButton *findbutton; + QPushButton *cancelbutton; +}; + + +#endif diff -r 000000000000 -r 7a96bd401351 flagobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flagobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,201 @@ +#include "flagobj.h" + +///////////////////////////////////////////////////////////////// +// FlagObj +///////////////////////////////////////////////////////////////// +FlagObj::FlagObj() +{ +// cout << "Const FlagObj ()\n"; + init (); +} + +FlagObj::FlagObj(QCanvas* c):MapObj(c) +{ +// cout << "Const FlagObj\n"; + init (); +} + +FlagObj::FlagObj (FlagObj* io) +{ + copy (io); +} + +FlagObj::~FlagObj() +{ +// cout << "Destr FlagObj " << name << "\n"; + delete (icon); +} + + +void FlagObj::init () +{ + name="undefined"; + + icon=new ImageObj (canvas); + icon->move (absPos.x(), absPos.y() ); + button=NULL; + state=false; +} + +void FlagObj::copy (FlagObj* other) +{ + MapObj::copy(other); + name=other->name; + tooltip=other->tooltip; + state=other->state; + icon->copy(other->icon); + setVisibility (other->isVisibleObj() ); + // button is not copied, because + // we won't copy to a parentRow and + // all others don't need a button +} + +void FlagObj::move(double x, double y) +{ + MapObj::move(x,y); + icon->move(x,y); + positionBBox(); +} + +void FlagObj::moveBy(double x, double y) +{ + move (x+absPos.x(),y+absPos.y() ); +} + +void FlagObj::setVisibility (bool v) +{ + MapObj::setVisibility(v); + if (v && state) + icon->setVisibility(true); + else + icon->setVisibility(false); +} + +void FlagObj::load (const QString &fn) +{ + icon->load(fn); + calcBBoxSize(); + positionBBox(); +} + +void FlagObj::load (const QPixmap &pm) +{ + icon->load(pm); + calcBBoxSize(); + positionBBox(); +} + +void FlagObj::setName(const QString &n) +{ + name=n; +} + +const QString FlagObj::getName() +{ + return name; +} + +void FlagObj::setToolTip(const QString &n) +{ + tooltip=n; +} + +const QString FlagObj::getToolTip() +{ + return tooltip; +} + +void FlagObj::setButton(QAction* b) +{ + button=b; +} + +void FlagObj::updateButton() +{ + if (button) + button->setOn(state); + else + qWarning ("FlagObj::updateButton no button defined"); +} + +QPixmap FlagObj::getPixmap() +{ + return icon->getPixmap(); +} + +bool FlagObj::isActive() +{ + return state; +} + +void FlagObj::toggle() +{ + if (state) + deactivate(); + else + activate(); +} + +void FlagObj::activate() +{ + state=true; + // only show icon, if flag itself is visible + if (visible) + { + icon->setVisibility (true); + calcBBoxSize(); + } +} + +void FlagObj::deactivate() +{ + state=false; + // if flag itself is invisible we don't need to call + if (visible) + { + icon->setVisibility (false); + calcBBoxSize(); + } +} + +void FlagObj::setEnabled(bool b) +{ + button->setEnabled (b); +} + + +void FlagObj::setUsed (bool b) +{ + used=b; +} + +bool FlagObj::isUsed() +{ + return used; +} + +void FlagObj::saveToDir (const QString &tmpdir, const QString &prefix) +{ + QString fn=tmpdir + prefix + name + ".png"; + icon->save (fn,"PNG"); +} + +void FlagObj::positionBBox() +{ + bbox.setX (absPos.x() ); + bbox.setY (absPos.y() ); +} + +void FlagObj::calcBBoxSize() +{ + if (visible && state) + { + bbox.setSize ( QSize( + icon->boundingRect().width(), + icon->boundingRect().height() ) ); + } else + { + bbox.setSize (QSize(0,0)); + } +} + diff -r 000000000000 -r 7a96bd401351 flagobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flagobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,53 @@ +#ifndef FLAGOBJ_H +#define FLAGOBJ_H + + +#include <qcanvas.h> +#include <qaction.h> + +#include "mapobj.h" +#include "imageobj.h" + +///////////////////////////////////////////////////////////////////////////// +class FlagObj:public MapObj { +public: + FlagObj (); + FlagObj (QCanvas*); + FlagObj (FlagObj*); + ~FlagObj (); + virtual void init (); + virtual void copy (FlagObj*); + virtual void move (double x,double y); // move to absolute Position + virtual void moveBy (double x,double y); // move to relative Position + virtual void setVisibility(bool); + void load (const QString&); + void load (const QPixmap&); + void setName (const QString&); + const QString getName (); + void setToolTip(const QString&); + const QString getToolTip(); + void setButton (QAction*); + void updateButton (); + QPixmap getPixmap(); + bool isActive(); + void toggle(); + void activate(); + void deactivate(); + void setEnabled (bool); + void setUsed (bool); + bool isUsed(); + void saveToDir (const QString&, const QString&); + +protected: + QString name; + QString tooltip; + bool state; + bool used; + virtual void positionBBox(); + virtual void calcBBoxSize(); +private: + ImageObj* icon; + QAction* button; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 flagrowobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flagrowobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,322 @@ +#include "flagrowobj.h" + +///////////////////////////////////////////////////////////////// +// FlagRowObj +///////////////////////////////////////////////////////////////// +FlagRowObj::FlagRowObj() +{ + cout << "Const FlagRowObj ()\n"; + init (); +} + +FlagRowObj::FlagRowObj(QCanvas* c):MapObj(c) +{ +// cout << "Const FlagRowObj\n"; + init (); +} + +FlagRowObj::~FlagRowObj() +{ +// cout << "Destr FlagRowObj\n"; + flag.clear(); +} + +void FlagRowObj::init () +{ + flag.setAutoDelete (true); + parentRow=NULL; +} + +void FlagRowObj::copy (FlagRowObj* other) +{ + MapObj::copy(other); + parentRow=other->parentRow; + flag.clear(); + FlagObj *fo; + for (fo=other->flag.first(); fo; fo=other->flag.next() ) + addFlag (fo); +} + +void FlagRowObj::clone (FlagRowObj* pr) +{ + // Difference to copy: + // We don't copy the flags here, they + // are created on the fly by toggle and activate + // This saves lots of canvas objects. + MapObj::copy(pr); + flag.clear(); + parentRow=pr; +} + +void FlagRowObj::move(double x, double y) +{ + MapObj::move(x,y); + int dx=0; + FlagObj *fo; + for (fo=flag.first(); fo; fo=flag.next() ) + { + fo->move(x+dx,y); + dx+=QSize(fo->getSize() ).width(); + } +} + +void FlagRowObj::moveBy(double x, double y) +{ + move (x+absPos.x(),y+absPos.y() ); +} + +void FlagRowObj::setVisibility (bool v) +{ + MapObj::setVisibility(v); + FlagObj *fo; + for (fo=flag.first(); fo; fo=flag.next() ) + fo->setVisibility (v); +} + +FlagObj* FlagRowObj::addFlag (FlagObj *fo) +{ + FlagObj *newfo=new FlagObj (canvas); + newfo->move (absPos.x() + bbox.width(), absPos.y() ); + newfo->copy (fo); // create a deep copy of fo + flag.append(newfo); + calcBBoxSize(); + positionBBox(); + return newfo; +} + +void FlagRowObj::positionBBox() +{ + bbox.setX (absPos.x() ); + bbox.setY (absPos.y() ); +} + +void FlagRowObj::calcBBoxSize() +{ + QSize size(0,0); + QSize boxsize(0,0); + FlagObj *fo; + for (fo=flag.first(); fo; fo=flag.next() ) + { + size=fo->getSize(); + // add widths + boxsize.setWidth(boxsize.width() + size.width() ); + // maximize height + if (size.height() > boxsize.height() ) + boxsize.setHeight(size.height() ); + } + bbox.setSize (QSize(boxsize.width(), boxsize.height() )); +} + +QString FlagRowObj::getFlagName (const QPoint &p) +{ + if (!inBBox (p)) return ""; + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + if (fo->inBBox (p)) return fo->getName(); + return ""; + + +} + +bool FlagRowObj::isActive (const QString &foname) +{ + FlagObj *fo=findFlag (foname); + if (parentRow) + { + if (fo) + return fo->isActive(); + else + qWarning ("FlagRowObj::isActive of "+name+" couldn't find "+foname); + + } else + if (fo) return true; + return false; +} + +void FlagRowObj::toggle (const QString &foname) +{ + FlagObj *fo=findFlag (foname); + if (fo) + { + // FlagObj is here, it will be active, too. + // Deactivate it by removing it from this row. + flag.remove (fo); + } else + { + // FlagObj is not present in this row. + // Copy it from parentRow + fo=parentRow->findFlag (foname); + if (fo) + { + fo=addFlag (fo); + fo->activate(); + } else + qWarning ("FlagRowObj ("+name+")::toggle ("+foname+") failed - could not find it in parentRow"); + } + calcBBoxSize(); + positionBBox(); +} + +void FlagRowObj::activate (const QString &foname) +{ + FlagObj *fo=findFlag (foname); + if (parentRow) + { + if (!fo) + { + // FlagObj is not present in this row. + // Copy it from parentRow and activate there + fo=parentRow->findFlag (foname); + if (fo) + { + fo=addFlag (fo); + fo->activate(); + fo->setVisibility (visible); + calcBBoxSize(); + positionBBox(); + } else + qWarning ("FlagRowObj ("+name+")::activate ("+foname+") failed - could not find it in parentRow"); + } + } else + { + // I am the parentRow, mark flag as used + if (fo) + { + fo->setUsed(true); + fo->activate(); + } + else + qWarning ("FlagRowObj::activate no FlagObj \""+foname+"\" found in parentRow"); + } +} + +void FlagRowObj::deactivate (const QString &foname) +{ + FlagObj *fo=findFlag (foname); + if (fo) flag.remove(fo); + calcBBoxSize(); + positionBBox(); +} + +void FlagRowObj::deactivateAll () +{ + if (!parentRow) + { + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + { + fo->deactivate(); + } + } else + qWarning ("FlagRowObj::deactivateAll mustn't be called for ordinary rows"); +} + +void FlagRowObj::setEnabled (bool b) +{ + // If we have no parent, we are the default FlagRowObj + // and have QToolbarButtons + if (!parentRow) + { + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + fo->setEnabled (b); + } +} + +void FlagRowObj::resetUsedCounter() +{ + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + fo->setUsed (false); +} + +QString FlagRowObj::saveToDir (const QString &tmpdir,const QString &prefix, bool writeflags) +{ + // Build xml string + QString s; + FlagObj *fo; + if (parentRow) + for (fo=flag.first();fo; fo=flag.next() ) + { + // save flag to xml, if flag is set + s+=valueElement("standardflag",fo->getName() ); + + // and tell parentRow, that this flag is used + parentRow->activate(fo->getName() ); + } + else + // Save icons to dir, if verbose is set (xml export) + // and I am a parentRow + // and this flag is really used somewhere + if (writeflags) + for (fo=flag.first();fo; fo=flag.next() ) + if (fo->isUsed()) fo->saveToDir (tmpdir,prefix); + return s; + +} + +void FlagRowObj::setName (const QString &n) +{ + name=n; +} + +void FlagRowObj::makeToolbar (QMainWindow *w, const QString &n) +{ + if (!parentRow) + { + // create bar and buttons + QToolBar* tb = new QToolBar( w); + tb->setLabel (n); + QAction *a; + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + { + a=new QAction ( + fo->getToolTip(), + fo->getPixmap(), + fo->getName(), + 0, + w, + fo->getName() + ); + a->setToggleAction(true); + // FIXME should not be enabled by default, later in updateToolbar + a->setEnabled(true); + a->addTo (tb); + fo->setButton (a); + connect(a, SIGNAL( activated() ), + w, SLOT( standardFlagChanged() ) ); + } + } else + qWarning ("FlagRowObj::makeToolbar mustn't be called for ordinary rows"); +} + +void FlagRowObj::updateToolBar() +{ + FlagObj *fo; + if (parentRow) + { + // We are just a branch, not the toolbar default + parentRow->deactivateAll(); + // In parentRow activate all existing (==active) flags + for (fo=flag.first();fo; fo=flag.next() ) + parentRow->activate(fo->getName()); + parentRow->updateToolBar(); + } else + { + // We are the toolbar default + for (fo=flag.first();fo; fo=flag.next() ) + fo->updateButton(); + } +} + +FlagObj* FlagRowObj::findFlag (const QString &name) +{ + FlagObj *fo; + for (fo=flag.first();fo; fo=flag.next() ) + { + if (fo->getName()==name) return fo; + } + return NULL; +} + diff -r 000000000000 -r 7a96bd401351 flagrowobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flagrowobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,41 @@ +#ifndef FLAGROWOBJ_H +#define FLAGROWOBJ_H + +#include <qmainwindow.h> + +#include "mapobj.h" +#include "flagobj.h" + +class FlagRowObj:public QObject,public MapObj { +public: + FlagRowObj (); + FlagRowObj (QCanvas*); + ~FlagRowObj (); + virtual void init (); + virtual void copy (FlagRowObj*); + virtual void clone(FlagRowObj*); + virtual void move (double,double); + virtual void moveBy (double,double); + virtual void setVisibility(bool); + virtual FlagObj* addFlag (FlagObj *fo); // make deep copy of FlagObj + virtual void positionBBox(); + virtual void calcBBoxSize(); + virtual QString getFlagName (const QPoint &p); // Find flag by position + bool isActive(const QString&); + void toggle (const QString&); + void activate(const QString&); + void deactivate(const QString&); + void deactivateAll(); + void setEnabled (bool); + void resetUsedCounter(); + QString saveToDir (const QString &,const QString &,bool); + void setName (const QString&); // prefix for exporting flags to dir + void makeToolbar (QMainWindow*, const QString &); // Create Toolbar buttons + void updateToolBar(); // Update Toolbar buttons +private: + FlagRowObj* parentRow; // look for flags in this row + FlagObj* findFlag (const QString&); + QPtrList <FlagObj> flag; + QString name; +}; +#endif diff -r 000000000000 -r 7a96bd401351 floatimageobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/floatimageobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,219 @@ +#include "floatimageobj.h" +#include "branchobj.h" +#include <math.h> + + +///////////////////////////////////////////////////////////////// +// FloatImageObj +///////////////////////////////////////////////////////////////// + +int FloatImageObj::counter=0; // make instance + + +FloatImageObj::FloatImageObj ():FloatObj() +{ +// cout << "Const FloatImageObj ()\n"; + setParObj (this); + init(); + depth=-1; +} + +FloatImageObj::FloatImageObj (QCanvas* c):FloatObj(c) +{ + // cout << "Const FloatImageObj (c) called from MapCenterObj (c)\n"; + setParObj (this); + init(); + depth=-1; +} + +FloatImageObj::FloatImageObj (QCanvas* c, LinkableMapObj* p):FloatObj(c,p) +{ + // cout << "Const FloatImageObj (c,p)\n"; + init(); +} + +FloatImageObj::~FloatImageObj () +{ +// cout << "Destr FloatImageObj "<<this<<"\n"; + delete(icon); +} + +void FloatImageObj::init () +{ + icon=new ImageObj (canvas); + icon->move (absPos.x(), absPos.y() ); + icon->setVisibility (true); + bbox.setSize (QSize(icon->size().width(), icon->size().height())); + filename=""; + originalFilename="no original name available"; + filetype=""; + saveInMap=true; +} + +void FloatImageObj::copy (FloatImageObj* other) +{ + FloatObj::copy (other); + icon->copy (other->icon); + filename=other->filename; + saveInMap=other->saveInMap; + positionBBox(); +} + +void FloatImageObj::setZ (const int &i) +{ + icon->setZ (i); + zPlane=i; +} + +int FloatImageObj::z () +{ + return lrint (icon->z()); +} + +bool FloatImageObj::load (const QString &fn) +{ + if( icon->load (fn)) + { + bbox.setSize (QSize(icon->size().width()+8, icon->size().height()+8)); + positionBBox(); + filename=fn; + filetype=QPixmap::imageFormat (fn); + return true; + } else + return false; + +} + +void FloatImageObj::save (const QString &fn, const char *format) +{ + icon->save (fn,format); +} + +void FloatImageObj::setOriginalFilename(const QString & fn) +{ + originalFilename=fn; +} + +QString FloatImageObj::getOriginalFilename() +{ + return originalFilename; +} + +void FloatImageObj::setVisibility(bool v) +{ + LinkableMapObj::setVisibility(v); + if (v) + icon->setVisibility(true); + else + icon->setVisibility(false); +} + +void FloatImageObj::move (double x, double y) +{ + FloatObj::move(x,y); + icon->move (x+4,y+4); + positionBBox(); +} + +void FloatImageObj::move (QPoint p) +{ + move (p.x(), p.y()); +} + +void FloatImageObj::positionBBox() +{ + // TODO +} + +void FloatImageObj::calcBBoxSize() +{ + // TODO +} + +QString FloatImageObj::saveToDir (const QString &tmpdir,const QString &prefix) +{ + counter++; + + QString posAttr= + attribut("relPosX",QString().setNum(relPos.x(),10)) + + attribut("relPosY",QString().setNum(relPos.y(),10)); + + QString useOrientAttr; + if (useOrientation) + useOrientAttr=attribut ("useOrientation","true"); + else + useOrientAttr=attribut ("useOrientation","false"); + + QString saveInMapAttr; + if (saveInMap) + saveInMapAttr=attribut ("saveInMap","true"); + else + + saveInMapAttr=attribut ("saveInMap","false"); + + QString exportAttr; + if (floatExport) + exportAttr=attribut ("floatExport","true"); + else + exportAttr=attribut ("floatExport","false"); + + QString zAttr=attribut ("zPlane",QString().setNum(zPlane)); + QString url; + + // prevent saving as GIF + if (filetype=="GIF") + filetype="PNG"; + + url="images/"+prefix+"image-" + QString().number(counter,10) + "." +filetype; + + // And really save the image + icon->save (tmpdir + "/" + url, filetype); + + return singleElement ("floatimage", + posAttr + + useOrientAttr + + saveInMapAttr + + exportAttr + + zAttr + + attribut ("href",QString ("file:")+url) + ); +} + +void FloatImageObj::resetSaveCounter() +{ + counter=0; +} + + +QRect FloatImageObj::getTotalBBox() +{ + return bbox; +} + +QRect FloatImageObj::getBBoxSizeWithChilds() +{ + //FIXME abstract in linkablemapobj.h, not calculated + return bboxTotal; +} + +void FloatImageObj::calcBBoxSizeWithChilds() +{ + //FIXME abstract in linkablemapobj.h +} + +QString FloatImageObj::getSelectString() +{ + QString s; + if (parObj) + { + if (parObj->getDepth()==0) + s= "fi:" + QString("%1").arg( ((BranchObj*)(parObj))->getFloatImageNum(this)); + else + s= ((BranchObj*)(parObj))->getSelectString() + ",fi:" + QString("%1").arg( ((BranchObj*)(parObj))->getFloatImageNum(this)); + } else + s="mc:"; + + return s; + +} + diff -r 000000000000 -r 7a96bd401351 floatimageobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/floatimageobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,44 @@ +#ifndef FLOATIMAGEOBJ_H +#define FLOATIMAGEOBJ_H + +#include "floatobj.h" + +///////////////////////////////////////////////////////////////////////////// +class FloatImageObj:public FloatObj { +public: + FloatImageObj (); + FloatImageObj (QCanvas*); + FloatImageObj (QCanvas*, LinkableMapObj* parent); + ~FloatImageObj (); + virtual void init (); + virtual void copy (FloatImageObj*); + virtual void setZ (const int&); + virtual int z(); + + virtual bool load (const QString &); + virtual void save (const QString &, const char *); + virtual void setOriginalFilename(const QString &); + virtual QString getOriginalFilename(); + virtual void setVisibility(bool); // set vis. for w + virtual void move (double x,double y); + virtual void move (QPoint); + virtual void positionBBox(); + virtual void calcBBoxSize(); + virtual QRect getTotalBBox(); // return BBox including childs + virtual QRect getBBoxSizeWithChilds(); // return size of BBox including childs + virtual void calcBBoxSizeWithChilds(); // calc size of BBox including childs recursivly + virtual QString saveToDir(const QString &,const QString&); + virtual void resetSaveCounter(); + virtual QString getSelectString(); + + +protected: + ImageObj *icon; + bool saveInMap; + static int counter; // numerate the files during saveToDir + QString filetype; + QString filename; + QString originalFilename; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 floatobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/floatobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,163 @@ +#include "floatobj.h" + +extern QAction* actionEditToggleFloatExport; + +///////////////////////////////////////////////////////////////// +// FloatObj +///////////////////////////////////////////////////////////////// + +FloatObj::FloatObj ():LinkableMapObj() +{ +// cout << "Const FloatObj ()\n"; + setParObj (this); + init(); + depth=-1; +} + +FloatObj::FloatObj (QCanvas* c):LinkableMapObj(c) +{ +// cout << "Const FloatObj (c) called from MapCenterObj (c)\n"; + setParObj (this); + init(); + depth=-1; +} + +FloatObj::FloatObj (QCanvas* c, LinkableMapObj* p):LinkableMapObj (c) +{ +// cout << "Const FloatObj (c,p)\n"; + setParObj (p); + depth=p->getDepth()+1; + init(); +} + +FloatObj::~FloatObj () +{ +// cout << "Destr FloatObj\n"; +} + +void FloatObj::init () +{ + setChildObj(this); + relPos=getRandPos(); + useOrientation=true; + floatExport=true; + zPlane=Z_ICON; +} + +void FloatObj::copy (FloatObj* other) +{ + LinkableMapObj::copy (other); + relPos=other->relPos; + useOrientation=other->useOrientation; + setVisibility (other->visible); +} + +void FloatObj::setRelPos() +{ + if (useOrientation) + { + if (parObj->getOrientation()==OrientLeftOfCenter) + relPos.setX ( parObj->x() +parObj->width() - bbox.width() -absPos.x()); + else + relPos.setX (absPos.x() - parObj->x() ); + } + else + relPos.setX (absPos.x() - parObj->x() ); + relPos.setY (absPos.y() - parObj->y() ); +} + +void FloatObj::setRelPos(const QPoint &p) +{ + relPos=p; +} + +void FloatObj::setZ(const int &i) +{ + zPlane=i; +} + +int FloatObj::z() +{ + return zPlane; +} + + +void FloatObj::setUseOrientation (const bool &b) +{ + if (useOrientation!=b) + { + useOrientation=b; + requestReposition(); + } +} + +void FloatObj::setFloatExport(const bool& b) +{ + floatExport=b; +} + +bool FloatObj::getFloatExport() +{ + return floatExport; +} + +void FloatObj::move (double x, double y) +{ + MapObj::move(x,y); + selbox->move(x,y); +} + +void FloatObj::move (QPoint p) +{ + move (p.x(), p.y()); +} + +void FloatObj::reposition() +{ + if (useOrientation) + { + if (parObj->getOrientation()==OrientLeftOfCenter) + move (parObj->x() - relPos.x() + parObj->width() - bbox.width(), parObj->y()+relPos.y()); + else + move (parObj->x()+relPos.x(), parObj->y()+relPos.y()); + } + else + move (parObj->x()+relPos.x(), parObj->y()+relPos.y()); + updateLink(); +} + +QRect FloatObj::getTotalBBox() +{ + return bbox; +} + +QRect FloatObj::getBBoxSizeWithChilds() +{ + return bboxTotal; +} + +void FloatObj::select() +{ + LinkableMapObj::select(); + // Temporary draw the link while FO is selected + if (style==StyleUndef) + { + setLinkStyle(getDefLinkStyle()); + setLinkColor(parObj->getLinkColor()); + } + + // Update FloatExport switch in context menu + if (floatExport) + actionEditToggleFloatExport->setEnabled (true); + else + actionEditToggleFloatExport->setEnabled (true); + + +} + +void FloatObj::unselect() +{ + LinkableMapObj::unselect(); + setLinkStyle (StyleUndef); +} + diff -r 000000000000 -r 7a96bd401351 floatobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/floatobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,45 @@ +#ifndef FLOATOBJ_H +#define FLOATOBJ_H + +#include "linkablemapobj.h" + +///////////////////////////////////////////////////////////////////////////// +class FloatObj:public LinkableMapObj { +public: + FloatObj (); + FloatObj (QCanvas*); + FloatObj (QCanvas*, LinkableMapObj* parent); + ~FloatObj (); + virtual void init (); + virtual void copy (FloatObj*); + virtual bool load (const QString&)=0; + virtual void setRelPos(); // set relPos to current parentPos + virtual void setRelPos(const QPoint&); + virtual void setZ(const int&); // set zPlane + virtual int z(); + virtual void setUseOrientation (const bool &); + virtual void setFloatExport (const bool &); + virtual bool getFloatExport (); + + virtual void move (double,double); + virtual void move (QPoint); + + virtual void reposition(); + + virtual QRect getTotalBBox(); // return BBox including childs + virtual QRect getBBoxSizeWithChilds(); // return size of BBox including childs + + virtual QString saveToDir(const QString &,const QString&)=0; + virtual void resetSaveCounter()=0; + + virtual void select(); + virtual void unselect(); + +protected: + QPoint relPos; + bool useOrientation; + bool floatExport; + int zPlane; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 frameobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frameobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,146 @@ +#include "frameobj.h" + +#include <qcolor.h> + +///////////////////////////////////////////////////////////////// +// FrameObj +///////////////////////////////////////////////////////////////// +FrameObj::FrameObj() : MapObj() +{ +// cout << "Const FrameObj ()\n"; + init (); +} + +FrameObj::FrameObj(QCanvas* c) :MapObj(c) +{ +// cout << "Const FrameObj\n"; + init (); +} + +FrameObj::~FrameObj() +{ + clear(); +} + +void FrameObj::init() +{ + type=NoFrame; + border=0; +} + +void FrameObj::clear() +{ + switch (type) + { + case NoFrame: + break; + case Rectangle: + delete rectFrame; + break; + } + type=NoFrame; + border=0; +} + +void FrameObj::move(double x, double y) +{ + switch (type) + { + case NoFrame: + break; + case Rectangle: + rectFrame->move (x,y); + break; + } +} + +void FrameObj::moveBy(double x, double y) +{ + MapObj::moveBy (x,y); +} + +void FrameObj::positionBBox() +{ +} + +void FrameObj::calcBBoxSize() +{ +} + +void FrameObj::setRect(const QRect &r) +{ + bbox=r; + switch (type) + { + case NoFrame: + break; + case Rectangle: + rectFrame->setX (bbox.x() ); + rectFrame->setY (bbox.y() ); + rectFrame->setSize (bbox.width(),bbox.height() ); + break; + } +} + +int FrameObj::getBorder() +{ + return border; +} + +FrameType FrameObj::getFrameType() +{ + return type; +} + +QString FrameObj::getFrameTypeName() +{ + switch (type) + { + case Rectangle: + return "Rectangle"; + break; + default: + return "NoFrame"; + } +} + +void FrameObj::setFrameType(const FrameType &t) +{ + if (t!=type) + { + clear(); + type=t; + switch (type) + { + case NoFrame: + border=0; + break; + case Rectangle: + border=10; + rectFrame = new QCanvasRectangle (canvas); + rectFrame->setZ(Z_FRAME); + rectFrame->setBrush( QColor("white") ); + rectFrame->setPen( QPen(QColor("black") )); + if (visible) + rectFrame->show(); + else + rectFrame->hide(); + break; + } + } +} + +void FrameObj::setFrameType(const QString &t) +{ + if (t=="Rectangle") + FrameObj::setFrameType (Rectangle); + else + FrameObj::setFrameType (NoFrame); +} + +void FrameObj::setVisibility (bool v) +{ + MapObj::setVisibility(v); + setFrameType (type); // changes on visibility depend on type... +} + diff -r 000000000000 -r 7a96bd401351 frameobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frameobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,33 @@ +#ifndef FRAMEOBJ_H +#define FRAMEOBJ_H + +#include "mapobj.h" + +enum FrameType {NoFrame,Rectangle}; + +class FrameObj:public MapObj { +public: + FrameObj(); + FrameObj(QCanvas*); + ~FrameObj(); + void init(); + void clear(); + void move (double x,double y); // move to absolute Position + void moveBy (double x,double y); // move to relative Position + void positionBBox(); + void calcBBoxSize(); + void setRect (const QRect &); // set dimensions + int getBorder(); + FrameType getFrameType (); + QString getFrameTypeName (); + void setFrameType (const FrameType &); + void setFrameType (const QString &); + void setVisibility(bool); + +protected: + FrameType type; + QCanvasRectangle* rectFrame; + int border; // distance text - frame +}; +#endif + diff -r 000000000000 -r 7a96bd401351 headingobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/headingobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,246 @@ +#include "headingobj.h" + +///////////////////////////////////////////////////////////////// +// HeadingObj +///////////////////////////////////////////////////////////////// +HeadingObj::HeadingObj() : MapObj() +{ +// cout << "Const HeadingObj ()\n"; + init (); +} + +HeadingObj::HeadingObj(QCanvas* c) :MapObj(c) +{ +// cout << "Const HeadingObj\n"; + init (); +} + +HeadingObj::~HeadingObj() +{ + textline.clear(); +} + +void HeadingObj::init() +{ + textline.setAutoDelete (TRUE); + textwidth=40; + color=QColor ("black"); + font=QFont(); +} + +void HeadingObj::copy(HeadingObj *other) +{ + MapObj::copy (other); + textwidth=other->textwidth; + color=other->color; + font=other->font; + setText (other->text() ); +} + +void HeadingObj::move(double x, double y) +{ + MapObj::move(x,y); + int h; // height of a textline + int ho; // offset of height while drawing all lines + if (textline.first() ) + h=textline.first()->boundingRect().height(); + else + h=2; + QCanvasText *t; + ho=0; + for (t=textline.first(); t; t=textline.next() ) + { + t->move(x,y+ho); + ho=ho+h; + } +} + + +void HeadingObj::moveBy(double x, double y) +{ + move (x+absPos.x(),y+absPos.y() ); +} + +void HeadingObj::positionBBox() +{ + bbox.setX (absPos.x()); + bbox.setY (absPos.y()); +} + +void HeadingObj::calcBBoxSize() +{ + int w=0; + int h=0; + // Using Backspace an empty heading might easily be created, then there + // would be textline.first()==NULL This can be worked around by the following, but + // then no selection would be visible, thus we prevent it in ::setText() + if (!textline.isEmpty() ) + { + QCanvasText *t; + for (t=textline.first(); t; t=textline.next() ) + { + h+=t->boundingRect().height(); + if (w<t->boundingRect().width() ) + w=t->boundingRect().width(); + } + } + bbox.setSize (QSize(w,h)); +} + +QCanvasText* HeadingObj::newLine(QString s) +{ + QCanvasText *t; + t = new QCanvasText(canvas); + t->setFont (font); + t->setColor (color); + t->setZ(Z_TEXT); + t->setText(s); + t->show(); + return t; +} + +void HeadingObj::setText (QString s) +{ + heading=s; + + // remove old textlines and prepare generating new ones + textline.clear(); + + // prevent empty textline, so at least a small selection stays + // visible for this heading + if (s.length()==0) s=" "; + + int i=0; // index for actual search for ws + int j=0; // index of last ws + int k=0; // index of "<br>" or similar linebreak + int br=0; // width of found break, e.g. for <br> it is 4 + + // set the text and wrap lines + while (s.length()>0) + { + // ok, some people wanted manual linebreaks, here we go + k=s.find ("<br>",i,false); + if (k>=0) + { + br=4; + i=k; + } else + i=s.find (" ",i,false); + if (i<0 && j==0) + { // no ws found at all in s + // append whole s + textline.append (newLine(s)); + s=""; + } else + { + if (i<0 && j>0) + { // no ws found in actual search + if (s.length()<=textwidth) + { + textline.append (newLine(s)); + s=""; + } else + { + textline.append (newLine(s.left(j))); + s=s.mid(j+1,s.length()); + j=0; + } + } else + { + if (i>= 0 && i<=static_cast <int> (textwidth)) + { // there is a ws in textwidth + if (br>0) + { + // here is a linebreak + textline.append (newLine(s.left(i))); + s=s.mid(i+br,s.length()); + i=0; + j=0; + br=0; + } else + { + j=i; + i++; + } + } else + { + if (i>static_cast <int> (textwidth) ) + { + if (j>0) + { // a ws out of textwidth, but we have also one in + textline.append (newLine(s.left(j))); + s=s.mid(j+1,s.length()); + i=0; + j=0; + } else + { // a ws out of text, but none in + textline.append (newLine(s.left(i))); + s=s.mid(i+1,s.length()); + i=0; + } + } + } + } + } + } + setVisibility (visible); + calcBBoxSize(); +} + +QString HeadingObj::text () +{ + return heading; +} + +void HeadingObj::setFont (QFont f) +{ + if (font!=f) + { + font=f; + setText (text()); + } +} + +QFont HeadingObj::getFont() +{ + return font; +} + + +void HeadingObj::setColor (QColor c) +{ + if (color!=c) + { + color=c; + QCanvasText *t; + for (t=textline.first(); t; t=textline.next() ) + t->setColor(c); + } +} + +QColor HeadingObj::getColor() +{ + return color; +} + +void HeadingObj::setVisibility (bool v) +{ + MapObj::setVisibility(v); + QCanvasText *t; + for (t=textline.first(); t; t=textline.next() ) + if (v) + t->show(); + else + t->hide(); +} + +int HeadingObj::getHeight () +{ + return bbox.height(); +} + +int HeadingObj::getWidth() +{ + return bbox.width(); +} + diff -r 000000000000 -r 7a96bd401351 headingobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/headingobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,37 @@ +#ifndef HEADINGOBJ_H +#define HEADINGOBJ_H + +#include "mapobj.h" + +class HeadingObj:public MapObj { +public: + HeadingObj(); + HeadingObj(QCanvas*); + virtual ~HeadingObj(); + virtual void init(); + virtual void copy(HeadingObj*); + virtual void move (double x,double y); // move to absolute Position + virtual void moveBy (double x,double y); // move to relative Position + virtual void positionBBox(); + virtual void calcBBoxSize(); +private: + QCanvasText* newLine(QString); // generate new textline +public: + virtual void setText(QString); + virtual QString text(); + virtual void setFont(QFont); + virtual QFont getFont(); + virtual void setColor(QColor); + virtual QColor getColor(); + virtual void setVisibility(bool); + virtual int getHeight(); + virtual int getWidth(); + +protected: + QString heading; + uint textwidth; // width for formatting text + QPtrList <QCanvasText> textline; // a part of e.g. the parabel + QColor color; + QFont font; +}; +#endif diff -r 000000000000 -r 7a96bd401351 imageobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,100 @@ +#include "imageobj.h" + +///////////////////////////////////////////////////////////////// +// ImageObj +///////////////////////////////////////////////////////////////// +ImageObj::ImageObj( QCanvas *canvas ) + : QCanvasRectangle( canvas ) +{ +// cout << "Const ImageObj (canvas)\n"; + setZ(Z_ICON); + type=undef; +} + +ImageObj::~ImageObj() +{ +// cout << "Destr ImageObj\n"; +} + +void ImageObj::copy(ImageObj* other) +{ + setSize (other->width(), other->height() ); + setVisibility (other->isVisible() ); + type=other->type; +// if (type==qimage) + image=other->image; +// if (type==qpixmap) + pixmap=other->pixmap; +} + +void ImageObj::setVisibility (bool v) +{ + if (v) + show(); + else + hide(); +} + +void ImageObj::save(const QString &fn, const char *format) +{ + switch (type) + { + case undef: qWarning("undef");break; + case qimage: image.save (fn,format,-1);break; + case qpixmap: pixmap.save (fn,format,-1);break; + } +} + +bool ImageObj::load (const QString &fn) +{ + if (!image.load( fn) ) + //cout << "Fatal Error in ImageObj::load ("<<fn<<")\n"; + return false; + setSize( image.width(), image.height() ); + type=qimage; + +#if !defined(Q_WS_QWS) + pixmap.convertFromImage(image, OrderedAlphaDither); +#endif + return true; +} + +bool ImageObj::load (QPixmap pm) +{ +#if !defined(Q_WS_QWS) + //pixmap.convertFromImage(image, OrderedAlphaDither); + type=qpixmap; + pixmap=pm; + setSize( pm.width(), pm.height() ); +#else + type=qimage; + image=pm; + setSize( image.width(), image.height() ); +#endif + return true; +} + +void ImageObj::setImage(QImage img) +{ + type=qimage; + image=img; + pixmap.convertFromImage(image, OrderedAlphaDither); +} + +QPixmap ImageObj::getPixmap() +{ + return pixmap; +} + +void ImageObj::drawShape( QPainter &p ) +{ +// On Qt/Embedded, we can paint a QImage as fast as a QPixmap, +// but on other platforms, we need to use a QPixmap. +#if defined(Q_WS_QWS) + p.drawImage( int(x()), int(y()), image, 0, 0, -1, -1, OrderedAlphaDither ); +#else + p.drawPixmap( int(x()), int(y()), pixmap ); +#endif +} + + diff -r 000000000000 -r 7a96bd401351 imageobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,31 @@ +#ifndef IMAGEOBJ_H +#define IMAGEOBJ_H + +#include <qimage.h> +#include <qcanvas.h> +#include <qpainter.h> + +#include "mapobj.h" + +enum ImageType {qimage,qpixmap,undef}; + +class ImageObj: public QCanvasRectangle +{ +public: + ImageObj( QCanvas *canvas ); + ~ImageObj(); + virtual void copy (ImageObj*); + virtual void setVisibility(bool); + void save (const QString &, const char *); + bool load (const QString &); + bool load (QPixmap); + void setImage(QImage img); + QPixmap getPixmap(); +protected: + void drawShape( QPainter & ); +private: + QImage image; + QPixmap pixmap; + ImageType type; +}; +#endif diff -r 000000000000 -r 7a96bd401351 linkablemapobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linkablemapobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,693 @@ +//#include <math.h> + +#include "linkablemapobj.h" +#include "branchobj.h" +#include "mapeditor.h" + +#include "version.h" + + +///////////////////////////////////////////////////////////////// +// LinkableMapObj +///////////////////////////////////////////////////////////////// + +LinkableMapObj::LinkableMapObj():MapObj() +{ + // cout << "Const LinkableMapObj ()\n"; + init (); +} + +LinkableMapObj::LinkableMapObj(QCanvas* c) :MapObj(c) +{ +// cout << "Const LinkableMapObj\n"; + init (); +} + +LinkableMapObj::LinkableMapObj (LinkableMapObj* lmo) : MapObj (lmo->canvas) +{ + copy (lmo); +} + +LinkableMapObj::~LinkableMapObj() +{ + delete (bottomline); + delete (selbox); + delete (frame); + delLink(); +} + +void LinkableMapObj::delLink() +{ + switch (style) + { + case StyleLine: + delete (l); + break; + case StyleParabel: + segment.clear(); + break; + case StylePolyLine: + delete (p); + delete (l); + break; + case StylePolyParabel: + delete (p); + segment.clear(); + break; + default: + break; + } +} + +void LinkableMapObj::init () +{ + depth=-1; + childObj=NULL; + parObj=NULL; + parObjTmpBuf=NULL; + parPos=QPoint(0,0); + childPos=QPoint(0,0); + link2ParPos=false; + l=NULL; + orientation=OrientUndef; + linkwidth=20; + thickness_start=8; + style=StyleUndef; + linkpos=LinkBottom; + segment.setAutoDelete (TRUE); + arcsegs=13; + QPointArray pa(arcsegs*2+2); + + bottomline=new QCanvasLine(canvas); + bottomline->setPen( QPen(linkcolor, 1) ); + bottomline->setZ(Z_LINK); + bottomline->show(); + + // Prepare showing the selection of a MapObj + selbox = new QCanvasRectangle (canvas); + selbox->setZ(Z_SELBOX); + selbox->setBrush( QColor(255,255,0) ); + selbox->setPen( QPen(QColor(255,255,0) )); + selbox->hide(); + selected=false; + + // initialize frame + frame = new FrameObj (canvas); + + repositionRequest=false; +} + +void LinkableMapObj::copy (LinkableMapObj* other) +{ + MapObj::copy(other); + bboxTotal=other->bboxTotal; +// linkwidth=other->linkwidth; + + setLinkStyle(other->style); + setLinkColor (other->linkcolor); +} + +void LinkableMapObj::setChildObj(LinkableMapObj* o) +{ + childObj=o; +} + +void LinkableMapObj::setParObj(LinkableMapObj* o) +{ + parObj=o; + mapEditor=parObj->getMapEditor(); +} + +void LinkableMapObj::setParObjTmp(LinkableMapObj*,QPoint,int) +{ +} + +void LinkableMapObj::unsetParObjTmp() +{ +} + +LinkStyle LinkableMapObj::getDefLinkStyle () +{ + LinkStyle ls=mapEditor->getLinkStyle(); + switch (ls) + { + case StyleLine: + return ls; + break; + case StyleParabel: + return ls; + break; + case StylePolyLine: + if (depth>1) + return StyleLine; + else + return ls; + break; + case StylePolyParabel: + if (depth>1) + return StyleParabel; + else + return ls; + break; + default: + break; + } + return StyleUndef; +} + +void LinkableMapObj::setLinkStyle(LinkStyle newstyle) +{ + delLink(); + + style=newstyle; + + if (childObj!=NULL && parObj != NULL) + { + int i; + QCanvasLine* cl; + switch (style) + { + case StyleUndef: + bottomline->hide(); + break; + case StyleLine: + l = new QCanvasLine(canvas); + l->setPen( QPen(linkcolor, 1) ); + l->setZ(Z_LINK); + if (visible) + l->show(); + else + l->hide(); + break; + case StyleParabel: + for (i=0;i<arcsegs;i++) + { + cl = new QCanvasLine(canvas); + cl->setPen( QPen(linkcolor, 1) ); + cl->setPoints( 0,0,i*10,100); + cl->setZ(Z_LINK); + if (visible) + cl->show(); + else + cl->hide(); + segment.append(cl); + } + pa0.resize (arcsegs+1); + break; + case StylePolyLine: + p = new QCanvasPolygon(canvas); + p->setBrush( linkcolor ); + p->setZ(Z_LINK); + if (visible) + p->show(); + else + p->hide(); + pa0.resize (3); + // TODO + // a bit awkward: draw the lines additionally to polygon, to avoid + // missing pixels, when polygon is extremly flat + l = new QCanvasLine(canvas); + l->setPen( QPen(linkcolor, 1) ); + l->setZ(Z_LINK); + if (visible) + l->show(); + else + l->hide(); + break; + case StylePolyParabel: + p = new QCanvasPolygon(canvas); + p->setBrush( linkcolor ); + p->setZ(Z_LINK); + if (visible) + p->show(); + else + p->hide(); + pa0.resize (arcsegs*2+2); + pa1.resize (arcsegs+1); + pa2.resize (arcsegs+1); + + // TODO + // a bit awkward: draw the lines additionally + // to polygon, to avoid missing pixels, + // if polygon is extremly flat + for (i=0;i<arcsegs;i++) + { + cl = new QCanvasLine(canvas); + cl->setPen( QPen(linkcolor, 1) ); + cl->setPoints( 0,0,i*10,100); + cl->setZ(Z_LINK); + if (visible) + cl->show(); + else + cl->hide(); + segment.append(cl); + } + break; + default: + break; + } + } else + { + cout << "Error: ChildObj or parObj == NULL in LinkableMapObj::setLinkStyle\n"; + } +} + +LinkStyle LinkableMapObj::getLinkStyle() +{ + return style; +} + +void LinkableMapObj::setLinkPos(LinkPos lp) +{ + linkpos=lp; +} + +LinkPos LinkableMapObj::getLinkPos() +{ + return linkpos; +} + + +void LinkableMapObj::setLinkColor() +{ + // Overloaded in BranchObj and childs + // here only set default color + setLinkColor (mapEditor->getDefLinkColor()); +} + +void LinkableMapObj::setLinkColor(QColor col) +{ + linkcolor=col; + bottomline->setPen( QPen(linkcolor, 1) ); + QCanvasLine *cl; + switch (style) + { + case StyleLine: + l->setPen( QPen(col,1)); + break; + case StyleParabel: + for (cl=segment.first(); cl; cl=segment.next() ) + cl->setPen( QPen(col,1)); + break; + case StylePolyLine: + p->setBrush( QBrush(col)); + l->setPen( QPen(col,1)); + break; + case StylePolyParabel: + p->setBrush( QBrush(col)); + for (cl=segment.first(); cl; cl=segment.next() ) + cl->setPen( QPen(col,1)); + break; + default: + break; + } // switch (style) + updateLink(); +} + +QColor LinkableMapObj::getLinkColor() +{ + return linkcolor; +} + +FrameType LinkableMapObj::getFrameType() +{ + return frame->getFrameType(); +} + +void LinkableMapObj::setFrameType(const FrameType &t) +{ + frame->setFrameType(t); + calcBBoxSize(); + positionBBox(); + requestReposition(); +} + +void LinkableMapObj::setFrameType(const QString &t) +{ + frame->setFrameType(t); + calcBBoxSize(); + positionBBox(); + requestReposition(); +} + +void LinkableMapObj::setVisibility (bool v) +{ + MapObj::setVisibility (v); + if (visible) + { + bottomline->show(); + // FIXME lines and segments should be done in LMO? + if (style==StyleLine && l) + { + l->show(); + } else + { + QCanvasLine* cl; + for (cl=segment.first(); cl; cl=segment.next() ) + cl->show(); + } + } else + { + bottomline->hide(); + if (style==StyleLine && l) + { + l->hide(); + } else + { + QCanvasLine* cl; + for (cl=segment.first(); cl; cl=segment.next() ) + cl->hide(); + } + } +} + +void LinkableMapObj::updateLink() +{ + // needs: + // childPos of parent + // orient of parent + // style + // + // sets: + // orientation + // childPos + // parPos + // offset + // drawing of the link itself + + + // updateLink is called from move, but called from constructor we don't + // have parents yet... + if (style==StyleUndef) return; + + if (frame->getFrameType() == NoFrame) + linkpos=LinkBottom; + else + linkpos=LinkMiddle; + switch (linkpos) + { + case LinkMiddle: + offset=bbox.height() /2; + break; + default : + offset=bbox.height()-1; // draw link to bottom of bbox + break; + } + + double p2x,p2y; // Set P2 Before setting + if (!link2ParPos) + { + p2x=QPoint( parObj->getChildPos() ).x(); // P1, we have to look at + p2y=QPoint( parObj->getChildPos() ).y(); // orientation + } else + { + p2x=QPoint( parObj->getParPos() ).x(); + p2y=QPoint( parObj->getParPos() ).y(); + } + + LinkOrient orientOld=orientation; + + // Set orientation, first look for orientation of parent + if (parObj->getOrientation() != OrientUndef ) + // use the orientation of the parent: + orientation=parObj->getOrientation(); + else + { + // calc orientation depending on position rel to mapCenter + if (absPos.x() < QPoint(parObj->getChildPos() ).x() ) + orientation=OrientLeftOfCenter; + else + orientation=OrientRightOfCenter; + } + + if ((orientation!=orientOld) && (orientOld!= OrientUndef)) + { + // Orientation just changed. Reorient this subbranch, because move is called + // before updateLink => Position is still the old one, which could lead to + // linking of subranch to itself => segfault + // + // Also possible: called in BranchObj::init(), then orientOld==OrientUndef, + // no need to reposition now + reposition(); + } + + if (orientation==OrientLeftOfCenter ) + { + childPos=QPoint (absPos.x(),absPos.y()+offset); + parPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); + } else + { + childPos=QPoint (absPos.x()+ bbox.width(), absPos.y() + offset ); + parPos=QPoint (absPos.x(),absPos.y()+offset); + } + /* FIXME + cout << " LMO::updateLink absPos="<<absPos<<endl; + cout << " LMO::updateLink childPos="<<childPos<<endl; + cout << " LMO::updateLink parPos="<<parPos<<endl; + cout << " LMO::updateLink offset="<<offset<<endl; + cout << " LMO::updateLink bbox.w="<<bbox.width()<<endl; + cout << " LMO::updateLink bbox.h="<<bbox.height()<<endl; + */ + + double p1x=parPos.x(); // Link is drawn from P1 to P2 + double p1y=parPos.y(); + + double vx=p2x - p1x; // V=P2-P1 + double vy=p2y - p1y; + + // Draw the horizontal line below heading (from ChildPos to ParPos) + bottomline->setPoints (lrint(childPos.x()), + lrint(childPos.y()), + lrint(p1x), + lrint(p1y) ); + + double a; // angle + if (vx > -0.000001 && vx < 0.000001) + a=M_PI_2; + else + a=atan( vy / vx ); + // "turning point" for drawing polygonal links + QPoint tp (-lrint(sin (a)*thickness_start), lrint(cos (a)*thickness_start)); + + QCanvasLine *cl; + + int i; + + // Draw the link + switch (style) + { + case StyleLine: + l->setPoints( lrint (parPos.x()), + lrint(parPos.y()), + lrint(p2x), + lrint(p2y) ); + break; + case StyleParabel: + parabel (pa0, p1x,p1y,p2x,p2y); + i=0; + for (cl=segment.first(); cl; cl=segment.next() ) + { + cl->setPoints( pa0.point(i).x(), pa0.point(i).y(),pa0.point(i+1).x(),pa0.point(i+1).y()); + i++; + } + break; + case StylePolyLine: + pa0[0]=QPoint (lrint(p2x+tp.x()), lrint(p2y+tp.y())); + pa0[1]=QPoint (lrint(p2x-tp.x()), lrint(p2y-tp.y())); + pa0[2]=QPoint (lrint (parPos.x()), lrint(parPos.y()) ); + p->setPoints (pa0); + // here too, draw line to avoid missing pixels + l->setPoints( lrint (parPos.x()), + lrint(parPos.y()), + lrint(p2x), + lrint(p2y) ); + break; + case StylePolyParabel: + parabel (pa1, p1x,p1y,p2x+tp.x(),p2y+tp.y()); + parabel (pa2, p1x,p1y,p2x-tp.x(),p2y-tp.y()); + for (i=0;i<=arcsegs;i++) + { + // Combine the arrays to a single one + pa0[i]=pa1[i]; + pa0[i+arcsegs+1]=pa2[arcsegs-i]; + } + p->setPoints (pa0); + i=0; + for (cl=segment.first(); cl; cl=segment.next() ) + { + cl->setPoints( pa1.point(i).x(), pa1.point(i).y(),pa1.point(i+1).x(),pa1.point(i+1).y()); + i++; + } + break; + default: + break; + } // switch (style) +} + +LinkableMapObj* LinkableMapObj::getChildObj() +{ + return childObj; +} + +LinkableMapObj* LinkableMapObj::getParObj() +{ + return parObj; +} + +QPoint LinkableMapObj::getChildPos() +{ + return childPos; +} + +QPoint LinkableMapObj::getParPos() +{ + return parPos; +} + +QPoint LinkableMapObj::getRelPos() +{ + if (!parObj) return QPoint (0,0); + return QPoint( + absPos.x() - parObj->x(), + absPos.y() - parObj->y() + ); +} + +LinkOrient LinkableMapObj::getOrientation() +{ + return orientation; +} + +int LinkableMapObj::getDepth() +{ + return depth; +} + +void LinkableMapObj::setMapEditor (MapEditor *me) +{ + mapEditor=me; +} + +MapEditor* LinkableMapObj::getMapEditor () +{ + return mapEditor; +} + +QPoint LinkableMapObj::getRandPos() +{ + // Choose a random position with given distance to parent: + double a=rand()%360 * 2 * M_PI / 360; + return QPoint ( (int)( + 150*cos (a)), + (int)( + 150*sin (a))); +} + +void LinkableMapObj::alignRelativeTo (QPoint ref) +{ +} + +void LinkableMapObj::reposition() +{ +cout << "LMO::reposition ???"<<endl; + if (depth==0) + { + // only calculate the sizes once. If the deepest LMO changes its height, + // all upper LMOs have to change, too. + calcBBoxSizeWithChilds(); + + alignRelativeTo ( QPoint (absPos.x(), + absPos.y()-(bboxTotal.height()-bbox.height())/2) ); + } else + { + // This is only important for moving branches: + // For editing a branch it isn't called... + alignRelativeTo ( QPoint (absPos.x(), + absPos.y()-(bboxTotal.height()-bbox.height())/2) ); + } +} + +void LinkableMapObj::requestReposition() +{ + if (!repositionRequest) + { + // Pass on the request to parental objects, if this hasn't + // been done yet + repositionRequest=true; + if (parObj) parObj->requestReposition(); + } +} + +void LinkableMapObj::forceReposition() +{ + // Sometimes a reposition has to be done immediatly: For example + // if the note editor flag changes, there is no user event in mapeditor + // which could collect requests for a reposition. + // Then we have to call forceReposition() + // But no rule without exception: While loading a map or undoing it, + // we want to block expensive repositioning, but just do it once at + // the end, thus check first: + + if (mapEditor->blockReposition()) return; + + // Pass on the request to parental objects, if this hasn't been done yet + + if (parObj) + parObj->forceReposition(); + else + reposition(); } + +bool LinkableMapObj::repositionRequested() +{ + return repositionRequest; +} + + +void LinkableMapObj::setSelBox() +{ + selbox->setX (bbox.x() ); + selbox->setY (bbox.y() ); + selbox->setSize (bbox.width(), bbox.height() ); +} + +void LinkableMapObj::select() +{ + setSelBox(); + selected=true; + selbox->show(); +} + + +void LinkableMapObj::unselect() +{ + selected=false; + selbox->hide(); +} + +void LinkableMapObj::parabel (QPointArray &ya, double p1x, double p1y, double p2x, double p2y) + +{ + double vx=p2x - p1x; // V=P2-P1 + double vy=p2y - p1y; + + double dx; // delta x during calculation of parabel + + double pnx; // next point + double pny; + double m; + + if (vx > -0.0001 && vx < 0.0001) + m=0; + else + m=(vy / (vx*vx)); + dx=vx/(arcsegs); + int i; + ya.setPoint (0,QPoint (lrint(p1x),lrint(p1y))); + for (i=1;i<=arcsegs;i++) + { + pnx=p1x+dx; + pny=m*(pnx-parPos.x())*(pnx-parPos.x())+parPos.y(); + ya.setPoint (i,QPoint (lrint(pnx),lrint(pny))); + p1x=pnx; + p1y=pny; + } +} + diff -r 000000000000 -r 7a96bd401351 linkablemapobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linkablemapobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,113 @@ +#ifndef LINKABLEMAPOBJ_H +#define LINKABLEMAPOBJ_H + +#include "frameobj.h" +#include "noteobj.h" +#include "headingobj.h" +#include "flagrowobj.h" + +#define MAX_DEPTH 999 + +enum LinkOrient {OrientUndef,OrientLeftOfCenter, OrientRightOfCenter}; +enum LinkStyle { + StyleUndef, + StyleLine, + StyleParabel, + StylePolyLine, + StylePolyParabel +}; +enum LinkPos {LinkMiddle,LinkBottom}; +enum LinkColorHint {DefaultColor,HeadingColor}; + +class LinkableMapObj:public QObject, public MapObj { + Q_OBJECT +public: + LinkableMapObj (); + LinkableMapObj (QCanvas*); + LinkableMapObj (LinkableMapObj*); + ~LinkableMapObj (); + virtual void delLink(); + virtual void init (); + virtual void copy (LinkableMapObj*); + void setChildObj (LinkableMapObj*); + virtual void setParObj (LinkableMapObj*); + virtual void setParObjTmp (LinkableMapObj*,QPoint,int); // Only for moving Obj around + virtual void unsetParObjTmp(); // reuse original ParObj + LinkStyle getDefLinkStyle(); + void setLinkStyle(LinkStyle); + LinkStyle getLinkStyle(); + void setLinkPos (LinkPos); + LinkPos getLinkPos (); + + virtual void setLinkColor(); // sets color according to colorhint, overloaded + virtual void setLinkColor(QColor); + QColor getLinkColor(); + virtual FrameType getFrameType (); + virtual void setFrameType (const FrameType &); + virtual void setFrameType (const QString &); + virtual void setVisibility (bool); + virtual void updateLink(); // update parPos and childPos + // depending on pos + // redraw link with given style + LinkableMapObj* getChildObj(); // returns pointer to fromObj + LinkableMapObj* getParObj(); // returns pointer to toObj + QPoint getChildPos(); // returns pos where childs dock + QPoint getParPos(); // returns pos where parents dock + QPoint getRelPos(); // get position relative to parent (or (0,0)) + LinkOrient getOrientation(); // get orientation + virtual int getDepth(); // return depth + virtual void setMapEditor(MapEditor*); // set MapEditor (needed in LMO::updateNoteFlag) + virtual MapEditor* getMapEditor(); // get MapEditor (usually from parent); + virtual QPoint getRandPos(); // make randomised position + + virtual void alignRelativeTo(const QPoint ); + virtual void reposition(); + virtual void requestReposition(); // do reposition after next user event + virtual void forceReposition(); // to force a reposition now (outside + // of mapeditor e.g. in noteeditor + virtual bool repositionRequested(); + + virtual QRect getTotalBBox()=0; // return BBox including childs + virtual QRect getBBoxSizeWithChilds()=0;// return size of BBox including childs + virtual void calcBBoxSizeWithChilds()=0;// calc size of BBox including childs recursivly + + virtual void setSelBox(); + virtual void select(); + virtual void unselect(); + virtual QString getSelectString()=0; + +protected: + void parabel(QPointArray &,double,double,double,double); // Create Parabel connecting two points + QPoint childPos; + QPoint parPos; + bool link2ParPos; // While moving around, sometimes link to parent + MapEditor* mapEditor; // for updateNoteFlag() and toggleScroll() + LinkOrient orientation; + int linkwidth; // width of a link + int depth; // depth: undef=-1 mapCenter=0 branch=1..n + QRect bboxTotal; // bounding box including childs + + LinkableMapObj* childObj; + LinkableMapObj* parObj; + LinkableMapObj* parObjTmpBuf; // temporary buffer the original parent + int offset; // vertical offset of dockpos to pos + + int thickness_start; // for StylePoly* + LinkStyle style; + LinkPos linkpos; + QColor linkcolor; // Link color + QCanvasLine* l; // line style + QCanvasPolygon* p; // poly styles + int arcsegs; // arc: number of segments + QPtrList <QCanvasLine> segment; // a part of e.g. the parabel + QPointArray pa0; // For drawing of PolyParabel and PolyLine + QPointArray pa1; // For drawing of PolyParabel + QPointArray pa2; // For drawing of PolyParabel + QCanvasLine* bottomline; // on bottom of BBox + bool repositionRequest; // + + bool selected; // Used for marking the selection + QCanvasRectangle* selbox; + FrameObj *frame; // frame around object +}; +#endif diff -r 000000000000 -r 7a96bd401351 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,177 @@ +#include <qapplication.h> +#include <qpixmap.h> +#include <qtranslator.h> + +#include "settings.h" +#include "options.h" +#include "mainwindow.h" + +#include "icons/vym-48x48.xpm" +#include "icons/vym-editor.xpm" + +#include "flagrowobj.h" + +// Global variables +TextEditor *textEditor; // used in Constr. of LinkableMapObj + // initialized in mainwindow + +Main *mainWindow; // used in BranchObj::select() +MapEditor *clipboardME; +FlagRowObj *systemFlagsDefault; // used to copy from in LinkableMapObj +FlagRowObj *standardFlagsDefault; + +// Actions which change sometimes +QAction *actionFileSave; +QAction *actionFilePrint; +QAction *actionEditUndo; +QAction *actionEditCopy; +QAction *actionEditCut; +QAction *actionEditPaste; +QAction *actionEditMoveUp; +QAction *actionEditMoveDown; +QAction *actionEditToggleScroll; +QAction *actionEditOpenURL; +QAction *actionEditURL; +QAction *actionEditHeading2URL; +QAction *actionEditBugzilla2URL; +QAction *actionEditOpenVymLink; +QAction *actionEditVymLink; +QAction *actionEditDeleteVymLink; +QAction *actionEditMapInfo; +QAction *actionEditHeading; +QAction *actionEditDelete; +QAction *actionEditAddBranch; +QAction *actionEditAddBranchAbove; +QAction *actionEditAddBranchBelow; +QAction *actionEditImportAdd; +QAction *actionEditImportReplace; +QAction *actionEditSaveBranch; +QAction *actionEditSelectFirst; +QAction *actionEditSelectLast; +QAction *actionEditLoadImage; +QAction *actionEditToggleFloatExport; + +QAction *actionFormatColor; +QAction *actionFormatPickColor; +QAction *actionFormatColorBranch; +QAction *actionFormatColorSubtree; +QAction *actionFormatBackColor; +QAction *actionFormatLinkColorHint; +QAction *actionFormatLinkColor; + +QActionGroup *actionGroupFormatFrameTypes; +QAction *actionFormatFrameNone; +QAction *actionFormatFrameRectangle; + +QActionGroup *actionGroupFormatLinkStyles; +QAction *actionFormatLinkStyleLine; +QAction *actionFormatLinkStyleParabel; +QAction *actionFormatLinkStylePolyLine; +QAction *actionFormatLinkStylePolyParabel; + +QAction *actionViewToggleNoteEditor; + +QAction *actionSettingsAutoselectHeading; +QAction *actionSettingsAutoselectText; +QAction *actionSettingsPasteNewHeading; +QAction *actionSettingsAutoedit; +QAction *actionSettingsUseDelKey; + +QPopupMenu *branchContextMenu; +QPopupMenu *floatimageContextMenu; +QPopupMenu *saveImageFormatMenu; +QPopupMenu *canvasContextMenu; +QPopupMenu *lastMapsMenu; +QPopupMenu *exportMenu; +QPopupMenu *exportImageFormatMenu; + + +Settings settings; +Options options; + +int statusbarTime=3500; + +int main(int argc, char** argv) +{ + QApplication app(argc,argv); + + + // Initialize translations + QTranslator translator (0); + translator.load( "vym_de", "." ); + app.installTranslator( &translator ); + + // Initializing the row of system flags + // is done in first call to MapEditor(), + // because we need at least one canvas first + systemFlagsDefault=NULL; + standardFlagsDefault=NULL; + + // Reading and initializing options commandline options + options.add ("version", SwitchOption, "v","version"); + options.add ("help", SwitchOption, "h", "help"); + options.add ("quit", SwitchOption, "q", "quit"); + options.add ("test", StringOption, "t", "test"); + options.setHelpText ( + "VYM - View Your Mind\n" + "--------------------\n\n" + "Information about vym can be found in vym.pdf,\n" + "which should be part of the vym package.\n" + "It is also available at the project homepage:\n\n" + "http://www.InSilmaril.de/vym\n"); + if (options.parse()) + { + cout << endl << options.getHelpText()<<endl; + return 1; + } + + if (options.isOn ("version")) + { + cout << "vym version "<<__VYM_VERSION__ + <<" (c) 2004 Uwe Drechsel - " + <<__BUILD_DATE__<<endl; + + return 0; + } + + if (options.isOn ("help")) + { + cout << options.getHelpText()<<endl; + return 0; + } + + if (options.isOn ("test")) + { + // FIXME testing string option only + cout << "Testing: "<<options.getArg("test")<< endl; + } + + // Initialize window of TextEditor + textEditor = new TextEditor(); + textEditor->setIcon (QPixmap (vym_editor_xpm)); + if (textEditor->showWithMain()) textEditor->show(); + + clipboardME = new MapEditor(); + clipboardME->resize (800,600); + clipboardME->setCaption("VYM - clipboard"); + clipboardME->hide(); + + // Initialize mainwindow after Mapeditors (because of Flags) + Main m; + //m.resize(m.sizeHint()); + m.setIcon (QPixmap (vym_logo_xpm)); + m.show(); + m.fileNew(); + m.loadCmdLine(); + + // For benchmarking we may want to quit immediatly after drawing + if (options.isOn ("quit")) + { + return 0; + } + + QObject::connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()) ); + + return app.exec(); +} + diff -r 000000000000 -r 7a96bd401351 mainwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mainwindow.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,2213 @@ +#include "mainwindow.h" + +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qmenubar.h> +#include <qapplication.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qcolor.h> +#include <qcolordialog.h> +#include <qbitmap.h> +#include <qinputdialog.h> + + +#include <iostream> +#include <stdlib.h> +#include <typeinfo> + +#include "version.h" + +#include "icons/filenew.xpm" +#include "icons/fileopen.xpm" +#include "icons/filesave.xpm" +#include "icons/fileprint.xpm" +#include "icons/editundo.xpm" +//#include "icons/editredo.xpm" // TODO +#include "icons/editcopy.xpm" +#include "icons/editcut.xpm" +#include "icons/editpaste.xpm" +#include "icons/editmoveup.xpm" +#include "icons/editmovedown.xpm" +#include "icons/formatcoloritem.xpm" +#include "icons/formatcolorbranch.xpm" +#include "icons/formatcolorpicker.xpm" +#include "icons/viewzoomreset.xpm" +#include "icons/viewzoomin.xpm" +#include "icons/viewzoomout.xpm" +#include "icons/vym-48x48.xpm" +#include "icons/flag-note.xpm" +#include "icons/flag-url.xpm" +#include "icons/flag-vymlink.xpm" +#include "icons/flag-scrolled-right.xpm" + +#include "flagrowobj.h" +#include "texteditor.h" +#include "mapeditor.h" +#include "exporthtmldialog.h" +#include "exportxhtmldialog.h" +#include "showtextdialog.h" +#include "process.h" +#include "settings.h" +#include "options.h" + +extern TextEditor *textEditor; +extern Main *mainWindow; +extern int statusbarTime; +extern MapEditor *clipboardME; +extern FlagRowObj* standardFlagsDefault; + +extern QAction* actionFileSave; +extern QAction* actionFilePrint; +extern QAction* actionEditUndo; +extern QAction *actionEditCopy; +extern QAction *actionEditCut; +extern QAction *actionEditPaste; +extern QAction *actionEditMoveUp; +extern QAction *actionEditMoveDown; +extern QAction *actionEditToggleScroll; +extern QAction* actionEditOpenURL; +extern QAction* actionEditURL; +extern QAction* actionEditHeading2URL; +extern QAction* actionEditBugzilla2URL; +extern QAction *actionEditOpenVymLink; +extern QAction *actionEditVymLink; +extern QAction *actionEditDeleteVymLink; +extern QAction *actionEditMapInfo; +extern QAction *actionEditHeading; +extern QAction *actionEditDelete; +extern QAction *actionEditAddBranch; +extern QAction *actionEditAddBranchAbove; +extern QAction *actionEditAddBranchBelow; +extern QAction *actionEditImportAdd; +extern QAction *actionEditImportReplace; +extern QAction *actionEditSaveBranch; +extern QAction *actionEditSelectFirst; +extern QAction *actionEditSelectLast; +extern QAction *actionEditLoadImage; +extern QAction *actionEditToggleFloatExport; + +extern QAction* actionFormatColor; +extern QAction* actionFormatPickColor; +extern QAction* actionFormatColorBranch; +extern QAction* actionFormatColorSubtree; +extern QAction* actionFormatLinkColorHint; +extern QAction* actionFormatBackColor; +extern QAction* actionFormatLinkColor; + +extern QActionGroup *actionGroupFormatFrameTypes; +extern QAction *actionFormatFrameNone; +extern QAction *actionFormatFrameRectangle; + +extern QActionGroup *actionGroupFormatLinkStyles; +extern QAction *actionFormatLinkStyleLine; +extern QAction *actionFormatLinkStyleParabel; +extern QAction *actionFormatLinkStylePolyLine; +extern QAction *actionFormatLinkStylePolyParabel; + +extern QAction *actionViewToggleNoteEditor; + +extern QAction* actionSettingsAutoedit; +extern QAction* actionSettingsAutoselectHeading; +extern QAction* actionSettingsAutoselectHeading; +extern QAction* actionSettingsAutoselectText; +extern QAction* actionSettingsPasteNewHeading; +extern QAction* actionSettingsUseDelKey; + +extern QPopupMenu* branchContextMenu; +extern QPopupMenu* floatimageContextMenu; +extern QPopupMenu* saveImageFormatMenu; +extern QPopupMenu* canvasContextMenu; +extern QPopupMenu* lastMapsMenu; +extern QPopupMenu* exportMenu; +extern QPopupMenu* exportImageFormatMenu; + + +extern Settings settings; +extern Options options; + +#if defined(Q_OS_LINUX) +extern void qt_wait_for_window_manager( QWidget* w ); +#endif + +Main::Main(QWidget* parent, const char* name, WFlags f) : + QMainWindow(parent,name,f) +{ + mainWindow=this; + + setCaption ("VYM - View Your Mind"); + + // Load window settings + resize (settings.readNumEntry( "/vym/mainwindow/geometry/width", 800), + settings.readNumEntry( "/vym/mainwindow/geometry/height",600)); + move (settings.readNumEntry( "/vym/mainwindow/geometry/posX", 100), + settings.readNumEntry( "/vym/mainwindow/geometry/posY", 100)); + + + // Initialize some settings, which are platform dependant + QString p,s; + + // application to open URLs + p="/vym/mainwindow/readerURL"; + #if defined(Q_OS_LINUX) + s=settings.readEntry (p,"konqueror"); + #else + #if defined(Q_OS_MACX) + s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari"); + #else + s=settings.readEntry (p,"mozilla"); + #endif + #endif + settings.writeEntry( p,s); + + // application to open PDFs + p="/vym/mainwindow/readerPDF"; + #if defined(Q_OS_LINUX) + s=settings.readEntry (p,"acroread"); + #else + #if defined(Q_OS_MACX) + s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari"); + #else + s=settings.readEntry (p,"acroread"); + #endif + #endif + settings.writeEntry( p,s); + + + maxLastMaps=9; + + // Create tab widget which holds the maps + tabWidget= new QTabWidget (this); + connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ), + this, SLOT( editorChanged( QWidget * ) ) ); + + setCentralWidget(tabWidget); + + setupFileActions(); + setupEditActions(); + setupFormatActions(); + setupViewActions(); + setupFlagActions(); + setupSettingsActions(); + setupContextMenus(); + if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) setupTestActions(); + setupHelpActions(); + + // After menu is created, we can enable some actions + actionFilePrint->setEnabled (true); + + statusBar(); + + // Create the default map into first tab +// fileNew(); +// tabWidget->addTab (new MapEditor(tabWidget,true), "unnamed"); +// currentMapEditor()->show(); + + // Initialize Find window + findWindow=new FindWindow(NULL,"findwindow"); + connect (findWindow, SIGNAL( findButton(QString) ), + this, SLOT(editFind(QString) ) ); + connect (findWindow, SIGNAL( somethingChanged() ), + this, SLOT(editFindChanged() ) ); + + updateGeometry(); +} + +Main::~Main() +{ + // Save Settings + settings.writeEntry( "/vym/mainwindow/geometry/width", width() ); + settings.writeEntry( "/vym/mainwindow/geometry/height", height() ); + settings.writeEntry( "/vym/mainwindow/geometry/posX", pos().x() ); + settings.writeEntry( "/vym/mainwindow/geometry/posY", pos().y() ); + + settings.writeEntry( "/vym/version/version", __VYM_VERSION__ ); + settings.writeEntry( "/vym/version/builddate", __BUILD_DATE__ ); + + settings.writeEntry( "/vym/mapeditor/editmode/autoselectheading",actionSettingsAutoselectHeading->isOn() ); + settings.writeEntry( "/vym/mapeditor/editmode/autoselecttext",actionSettingsAutoselectText->isOn() ); + settings.writeEntry( "/vym/mapeditor/editmode/pastenewheading",actionSettingsPasteNewHeading->isOn() ); + settings.writeEntry( "/vym/mapeditor/editmode/autoedit",actionSettingsAutoedit->isOn() ); + settings.writeEntry( "/vym/mapeditor/editmode/useDelKey",actionSettingsUseDelKey->isOn() ); + + QString s; + int maps=lastMaps.count(); + settings.writeEntry( "/vym/lastMaps/number",maps ); + for (int i=1;i<=maps;i++) + { + QStringList::Iterator it = lastMaps.at(i-1); + s=QString("/vym/lastMaps/map-%1").arg(i); + if (!s.isEmpty() && i<=maxLastMaps) + settings.writeEntry (s, *it); + } + + + // To make the texteditor save its settings, call the destructor + delete (textEditor); +} + +void Main::loadCmdLine() +{ + /* TODO draw some kind of splashscreen while loading... + if (qApp->argc()>1) + { + } + */ + + QStringList flist=options.getFileList(); + QStringList::Iterator it=flist.begin(); + + while (it !=flist.end() ) + { + fileLoad (*it, NewMap); + *it++; + } +} + + +void Main::statusMessage(const QString &s) +{ + statusBar()->message (s); +} + +void Main::closeEvent (QCloseEvent* ) +{ + fileExitVYM(); +} + +// File Actions +void Main::setupFileActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "File Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&File" ), menu ); + + // Keycodes: /usr/lib64/qt3/include/qnamespace.h + + QAction *a; + a = new QAction( tr( "New map" ), QPixmap( filenew_xpm ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); + a->addTo( tb ); + a->addTo( menu ); + + a = new QAction( tr( "Open" ), QPixmap( fileopen_xpm), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileLoad() ) ); + a->addTo( tb ); + a->addTo( menu ); + + lastMapsMenu = new QPopupMenu (this); + + menu->insertItem (tr("Open Recent"),lastMapsMenu ); + menu->insertSeparator(); + + a = new QAction( tr( "Save" ), QPixmap( filesave_xpm ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionFileSave=a; + + a = new QAction( tr( "Save &As" ), QPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) ); + a->addTo( menu ); + + menu->insertSeparator(); + + a = new QAction( tr( "Import directory structure (experimental)" ), QPixmap(), tr( "Import Dir" ), 0, this, "export" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileImportDir() ) ); + a->addTo( menu ); + + exportMenu = new QPopupMenu (this); + menu->insertItem (tr("Export"),exportMenu ); + + menu->insertSeparator(); + + + a = new QAction( tr( "Print" ), QPixmap( fileprint_xpm ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" ); + connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionFilePrint=a; + + a = new QAction( tr( "Close Map" ), QPixmap(), tr( "&Close Map" ), ALT + Key_C, this, "fileCloseMap" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileCloseMap() ) ); + a->addTo( menu ); + + a = new QAction( tr( "Exit VYM" ), QPixmap(), tr( "E&xit VYM" ), CTRL + Key_Q, this, "fileExitVYM" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExitVYM() ) ); + a->addTo( menu ); +} + + +//Edit Actions +void Main::setupEditActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "Edit Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Edit" ), menu ); + + QAction *a; + a = new QAction( tr( "Undo" ), QPixmap( editundo_xpm ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditUndo=a; + /* + a = new QAction( tr( "Redo" ), QPixmap( editredo_xpm ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) ); + a->addTo( tb ); + a->addTo( menu ); + */ + menu->insertSeparator(); + a = new QAction( tr( "Copy" ), QPixmap( editcopy_xpm ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditCopy=a; + a = new QAction( tr( "Cut" ), QPixmap( editcut_xpm ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditCut=a; + a = new QAction( tr( "Paste" ), QPixmap( editpaste_xpm ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" ); + connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditPaste=a; + a = new QAction( tr( "Move branch up" ), QPixmap( editmoveup_xpm ), tr( "Move up" ), Key_PageUp, this, "editMoveUp" ); + connect( a, SIGNAL( activated() ), this, SLOT( editMoveUp() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditMoveUp=a; + a = new QAction( tr( "Move branch down" ), QPixmap( editmovedown_xpm ), tr( "Move down" ), Key_PageDown, this, "editMoveDown" ); + connect( a, SIGNAL( activated() ), this, SLOT( editMoveDown() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditMoveDown=a; + + a = new QAction( tr( "Scroll branch" ), QPixmap(flag_scrolled_right_xpm), tr( "Scroll branch" ), Key_ScrollLock, this, "scroll" ); + connect( a, SIGNAL( activated() ), this, SLOT( editToggleScroll() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionEditToggleScroll=a; + + a = new QAction( tr( "Unscroll all" ), QPixmap(), tr( "Unscroll all scrolled branches" ), 0, this, "scroll" ); + connect( a, SIGNAL( activated() ), this, SLOT( editUnScrollAll() ) ); + a->addTo( menu ); + + menu->insertSeparator(); + + a = new QAction( tr( "Find" ), QPixmap(), tr( "Find" ), CTRL + Key_F, this, "find" ); + connect( a, SIGNAL( activated() ), this, SLOT( editOpenFindWindow() ) ); + a->addTo( menu ); + + menu->insertSeparator(); + + a = new QAction( tr( "Open URL" ), QPixmap(flag_url_xpm), tr( "Open URL" ), CTRL + Key_U, this, "url" ); + connect( a, SIGNAL( activated() ), this, SLOT( editOpenURL() ) ); + a->addTo( menu ); + a->addTo( tb ); + a->setEnabled (false); + actionEditOpenURL=a; + + a = new QAction( tr( "Edit URL" ), QPixmap(), tr( "Edit URL" ), SHIFT + CTRL + Key_U, this, "url" ); + connect( a, SIGNAL( activated() ), this, SLOT( editURL() ) ); + a->addTo( menu ); + a->setEnabled (false); + actionEditURL=a; + + a = new QAction( tr( "Use heading of selected branch as URL" ), QPixmap(), tr( "Use heading for URL" ), 0, this, "heading2url" ); + connect( a, SIGNAL( activated() ), this, SLOT( editHeading2URL() ) ); + a->addTo( menu ); + a->setEnabled (false); + actionEditHeading2URL=a; + + a = new QAction( tr( "Create URL to Bugzilla" ), QPixmap(), tr( "Create URL to Bugzilla" ), 0, this, "bugzilla2url" ); + connect( a, SIGNAL( activated() ), this, SLOT( editBugzilla2URL() ) ); + a->setEnabled (false); + actionEditBugzilla2URL=a; + + menu->insertSeparator(); + + 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" ); + connect( a, SIGNAL( activated() ), this, SLOT( editOpenVymLink() ) ); + a->addTo( menu ); + a->addTo( tb ); + a->setEnabled (false); + actionEditOpenVymLink=a; + + a = new QAction( tr( "Edit link to another vym map" ), QPixmap(), tr( "Edit vym link" ), 0, this, "editLinkMap" ); + connect( a, SIGNAL( activated() ), this, SLOT( editVymLink() ) ); + a->addTo( menu ); + a->setEnabled (false); + actionEditVymLink=a; + + a = new QAction( tr( "Delete link to another vym map" ), QPixmap(), tr( "Delete vym link" ), 0, this, "deleteLinkMap" ); + connect( a, SIGNAL( activated() ), this, SLOT( editDeleteVymLink() ) ); + a->addTo( menu ); + a->setEnabled (false); + actionEditDeleteVymLink=a; + + menu->insertSeparator(); + + a = new QAction( tr( "Edit Map Info" ), QPixmap(), tr( "Edit Map Info" ), 0, this, "editMapInfo" ); + connect( a, SIGNAL( activated() ), this, SLOT( editMapInfo() ) ); + a->addTo( menu ); + a->setEnabled (true); + actionEditMapInfo=a; + + menu->insertSeparator(); + + // Shortcuts to modify heading: + a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Enter, this, "editHeading" ); + connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditHeading=a; + a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Return, this, "editHeading" ); + connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) ); + //a->addTo ( menu ); + + // Shortcut to delete selection + a = new QAction( tr( "Delete Selection" ),tr( "Delete Selection" ), Key_Delete, this, "deleteBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editDeleteSelection() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditDelete=a; + + // Shortcut to add branch + #if defined (Q_OS_MACX) + a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), CTRL + Key_I, this, "newBranch" ); + #else + a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), Key_Insert, this, "newBranch" ); + #endif + connect( a, SIGNAL( activated() ), this, SLOT( editNewBranch() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditAddBranch=a; + + // Add branch above + a = new QAction( tr( "Add a branch above selection" ),tr( "Add branch above" ), SHIFT+Key_Insert, this, "newBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchAbove() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditAddBranchAbove=a; + + // Add branch below + a = new QAction( tr( "Add a branch below selection" ),tr( "Add branch below" ), CTRL +Key_Insert, this, "newBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchBelow() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditAddBranchBelow=a; + + // Import at selection (adding to selection) + a = new QAction( tr( "Add map at selection" ),tr( "Import (add)" ), 0, this, "importAdd" ); + connect( a, SIGNAL( activated() ), this, SLOT( editImportAdd() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditImportAdd=a; + + // Import at selection (replacing selection) + a = new QAction( tr( "Replace selection with map" ),tr( "Import (replace)" ), 0, this, "importReplace" ); + connect( a, SIGNAL( activated() ), this, SLOT( editImportReplace() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditImportReplace=a; + + // Save selection + a = new QAction( tr( "Save selction" ),tr( "Save selection" ), 0, this, "saveSelection" ); + connect( a, SIGNAL( activated() ), this, SLOT( editSaveBranch() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditSaveBranch=a; + + // Shortcuts for navigating with cursor: + a = new QAction( tr( "Select upper branch" ),tr( "Select upper branch" ), Key_Up, this, "upperBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editUpperBranch() ) ); + a = new QAction( tr( "Select lower branch" ),tr( "Select lower branch" ), Key_Down, this, "lowerBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editLowerBranch() ) ); + a = new QAction( tr( "Select left branch" ),tr( "Select left branch" ), Key_Left, this, "upperBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editLeftBranch() ) ); + a = new QAction( tr( "Select right branch" ),tr( "Select child branch" ), Key_Right, this, "rightBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editRightBranch() ) ); + a = new QAction( tr( "Select first branch" ),tr( "Select first branch" ), Key_Home, this, "firstBranch" ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditSelectFirst=a; + connect( a, SIGNAL( activated() ), this, SLOT( editFirstBranch() ) ); + a = new QAction( tr( "Select last branch" ),tr( "Select last branch" ), Key_End, this, "lastBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( editLastBranch() ) ); + a->setEnabled (false); + a->addTo ( menu ); + actionEditSelectLast=a; + + a = new QAction( tr( "Add Image" ),tr( "Add Image" ), 0, this, "loadImage" ); + connect( a, SIGNAL( activated() ), this, SLOT( editLoadImage() ) ); + actionEditLoadImage=a; +} + +// Format Actions +void Main::setupFormatActions() +{ + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Format" ), menu ); + + QToolBar *tb = new QToolBar( this ); + QAction *a; + QPixmap pix( 16,16); + pix.fill (black); + actionFormatColor= new QAction( tr( "Set Color" ), pix, tr( "Set &Color" ), 0, this, "formatColor" ); + connect( actionFormatColor, SIGNAL( activated() ), this, SLOT( formatSelectColor() ) ); + actionFormatColor->addTo( tb ); + actionFormatColor->addTo( menu ); + 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" ); + connect( a, SIGNAL( activated() ), this, SLOT( formatPickColor() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionFormatPickColor=a; + a= new QAction( tr( "Color branch" ), QPixmap(formatcoloritem_xpm), tr( "Color &branch" ), CTRL + Key_I, this, "colorItem" ); + connect( a, SIGNAL( activated() ), this, SLOT( formatColorItem() ) ); + a->setEnabled (false); + a->addTo( tb ); + a->addTo( menu ); + actionFormatColorBranch=a; + a= new QAction( tr( "Color Subtree" ), QPixmap(formatcolorbranch_xpm), tr( "Color sub&tree" ), CTRL + Key_T, this, "colorBranch" ); + connect( a, SIGNAL( activated() ), this, SLOT( formatColorBranch() ) ); + a->setEnabled (false); + a->addTo( menu ); + a->addTo( tb ); + actionFormatColorSubtree=a; + + menu->insertSeparator(); + actionGroupFormatLinkStyles=new QActionGroup ( this, "formatLinkStyles"); + actionGroupFormatLinkStyles->setExclusive (true); + a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleLine() ) ); + actionFormatLinkStyleLine=a; + a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleParabel() ) ); + actionFormatLinkStyleParabel=a; + a= new QAction( tr( "PolyLine" ), QPixmap(), tr( "Linkstyle Thick Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyLine() ) ); + actionFormatLinkStylePolyLine=a; + a= new QAction( tr( "PolyParabel" ), QPixmap(), tr( "Linkstyle Thick Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStylePolyParabel" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyParabel() ) ); + actionFormatLinkStylePolyParabel=a; + actionGroupFormatLinkStyles->addTo (menu); + + actionGroupFormatFrameTypes=new QActionGroup ( this, "formatFrameTypes"); + actionGroupFormatFrameTypes->setExclusive (true); + a = new QAction( tr( "No Frame" ),tr( "No Frame" ), 0, actionGroupFormatFrameTypes, "frameNone" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatFrameNone() ) ); + actionFormatFrameNone=a; + a = new QAction( tr( "Rectangle" ),tr( "Rectangle" ), 0, actionGroupFormatFrameTypes, "frameRectangle" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatFrameRectangle() ) ); + actionFormatFrameRectangle=a; + + menu->insertSeparator(); + a= new QAction( tr( "Use same color for links and headings" ), QPixmap(), tr( "&Use color of heading for link" ), 0, this, "formatLinkColorHint" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( formatToggleLinkColorHint() ) ); + a->addTo( menu ); + actionFormatLinkColorHint=a; + pix.fill (white); + actionFormatLinkColor= new QAction( tr( "Set Link Color" ), pix, tr( "Set &Link Color" ), 0, this, "formatLinkColor" ); + connect( actionFormatLinkColor, SIGNAL( activated() ), this, SLOT( formatSelectLinkColor() ) ); + actionFormatLinkColor->addTo( menu ); + actionFormatBackColor= new QAction( tr( "Set Background Color" ), pix, tr( "Set &Background Color" ), 0, this, "formatBackColor" ); + connect( actionFormatBackColor, SIGNAL( activated() ), this, SLOT( formatSelectBackColor() ) ); + actionFormatBackColor->addTo( menu ); +} + +// View Actions +void Main::setupViewActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "View Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&View" ), menu ); + + QAction *a; + a = new QAction( tr( "Zoom reset" ), QPixmap(viewzoomreset_xpm), tr( "reset Zoom" ), 0, this, "zoomReset" ); + connect( a, SIGNAL( activated() ), this, SLOT(viewZoomReset() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new QAction( tr( "Zoom in" ), QPixmap(viewzoomin_xpm), tr( "Zoom in" ), CTRL + Key_Plus, this, "zoomIn" ); + connect( a, SIGNAL( activated() ), this, SLOT(viewZoomIn() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new QAction( tr( "Zoom out" ), QPixmap(viewzoomout_xpm), tr( "Zoom out" ), CTRL + Key_Minus, this, "zoomOut" ); + connect( a, SIGNAL( activated() ), this, SLOT( viewZoomOut() ) ); + a->addTo( tb ); + a->addTo( menu ); + a = new QAction( tr( "Toggle Note Editor" ), QPixmap(flag_note_xpm), tr( "Toggle Note Editor" ), CTRL + Key_E , this, "noteEditor" ); + connect( a, SIGNAL( activated() ), this, SLOT(windowToggleNoteEditor() ) ); + a->setToggleAction(true); + if (textEditor->showWithMain()) + a->setOn(true); + else + a->setOn(false); + a->addTo( tb ); + a->addTo( menu ); + actionViewToggleNoteEditor=a; + a = new QAction( tr( "&Next Window" ), QPixmap(), tr( "Next Window" ), ALT + Key_N , this, "nextWindow" ); + connect( a, SIGNAL( activated() ), this, SLOT(windowNextEditor() ) ); + a->addTo( menu ); + a = new QAction( tr( "&Previous Window" ), QPixmap(), tr( "Previous Window" ), ALT + Key_P , this, "previousWindow" ); + connect( a, SIGNAL( activated() ), this, SLOT(windowPreviousEditor() ) ); + a->addTo( menu ); +} + +// Flag Actions +void Main::setupFlagActions() +{ + standardFlagsDefault->makeToolbar(this, "Standard Flags"); +} + +// Settings Actions +void Main::setupSettingsActions() +{ + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Settings" ), menu ); + + QAction *a; + + + a = new QAction( tr( "Set application to open pdf files" ), QPixmap(), tr( "Set application to open pdf files" ), 0, this, "setPDF" ); + connect( a, SIGNAL( activated() ), this, SLOT( settingsPDF() ) ); + a->addTo( menu ); + + a = new QAction( tr( "Set application to open an URL" ), QPixmap(), tr( "Set application to open an URL" ), 0, this, "setURL" ); + connect( a, SIGNAL( activated() ), this, SLOT( settingsURL() ) ); + a->addTo( menu ); + + menu->insertSeparator(); + a = new QAction( tr( "Edit branch after adding it" ), QPixmap(), tr( "Edit branch after adding it" ), 0, this, "autoedit" ); + a->setToggleAction(true); + a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoedit",true) ); + a->addTo( menu ); + actionSettingsAutoedit=a; + + a= new QAction( tr( "Select branch after adding it" ), QPixmap(), tr( "Select branch after adding it" ), 0, this, "autoselectheading" ); + a->setToggleAction(true); + a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselect",false) ); + a->addTo( menu ); + actionSettingsAutoselectHeading=a; + + a= new QAction( tr( "Select heading before editing" ), QPixmap(), tr( "Select existing heading" ), 0, this, "autoselectexistingtext" ); + a->setToggleAction(true); + a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselectexistingtext",true) ); + a->addTo( menu ); + actionSettingsAutoselectText=a; + + a= new QAction( tr( "Enable pasting into new branch" ), QPixmap(), tr( "Enable pasting into new branch" ), 0, this, "pastenewheading" ); + a->setToggleAction(true); + a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/newheadingisempty",true) ); + a->addTo( menu ); + actionSettingsPasteNewHeading=a; + + a= new QAction( tr( "Enable Delete key for deleting branches" ), QPixmap(), tr( "Enable Delete key" ), 0, this, "delkey" ); + a->setToggleAction(true); + a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/useDelKey",false) ); + a->addTo( menu ); + actionSettingsUseDelKey=a; +} + +// Test Actions +void Main::setupTestActions() +{ + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Test" ), menu ); + + QAction *a; + a = new QAction( tr( "Test Flag" ), QPixmap(), tr( "test flag" ), 0, this, "flag" ); + connect( a, SIGNAL( activated() ), this, SLOT( testFunction() ) ); + a->addTo( menu ); + + a = new QAction( tr( "Show Clipboard" ), QPixmap(), tr( "Show clipboard" ), 0, this, "clipboard" ); + connect( a, SIGNAL( activated() ), this, SLOT( testShowClipboard() ) ); + a->addTo( menu ); +} + +// Help Actions +void Main::setupHelpActions() +{ + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Help" ), menu ); + + QAction *a; + a = new QAction( tr( "Open VYM Documentation (pdf)" ), QPixmap(), tr( "Open VYM Documentation (pdf) " ), 0, this, "about" ); + connect( a, SIGNAL( activated() ), this, SLOT( helpDoc() ) ); + a->addTo( menu ); + + a = new QAction( tr( "Information about VYM" ), QPixmap(), tr( "About VYM" ), 0, this, "about" ); + connect( a, SIGNAL( activated() ), this, SLOT( helpAbout() ) ); + a->addTo( menu ); + + a = new QAction( tr( "Information about QT toolkit" ), QPixmap(), tr( "About QT" ), 0, this, "about" ); + connect( a, SIGNAL( activated() ), this, SLOT( helpAboutQT() ) ); + a->addTo( menu ); +} + +// Context Menus +void Main::setupContextMenus() +{ + QAction*a; + + // Context Menu for branch or mapcenter + branchContextMenu =new QPopupMenu (this); + actionEditAddBranch->addTo ( branchContextMenu ); + actionEditAddBranchAbove->addTo ( branchContextMenu ); + actionEditAddBranchBelow->addTo ( branchContextMenu ); + actionEditSaveBranch->addTo( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionEditImportAdd->addTo ( branchContextMenu ); + actionEditImportReplace->addTo ( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionEditOpenURL->addTo ( branchContextMenu ); + actionEditURL->addTo ( branchContextMenu ); + actionEditHeading2URL->addTo ( branchContextMenu ); + if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) + actionEditBugzilla2URL->addTo( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionEditOpenVymLink->addTo ( branchContextMenu ); + actionEditVymLink->addTo ( branchContextMenu ); + actionEditDeleteVymLink->addTo ( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionEditLoadImage->addTo( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionEditCopy->addTo( branchContextMenu ); + actionEditCut->addTo( branchContextMenu ); + actionEditPaste->addTo( branchContextMenu ); + branchContextMenu->insertSeparator(); + actionGroupFormatFrameTypes->addTo( branchContextMenu ); + + // Context menu for floatimage + floatimageContextMenu =new QPopupMenu (this); + saveImageFormatMenu=new QPopupMenu (this); + exportImageFormatMenu=new QPopupMenu (this); + + QStrList fmt = QImage::outputFormats(); + for (const char* f = fmt.first(); f; f = fmt.next()) + { + saveImageFormatMenu->insertItem( f ); + exportImageFormatMenu->insertItem( f ); + } + connect( saveImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( editSaveImage(int ) ) ); + connect( exportImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( fileExportImage(int ) ) ); + floatimageContextMenu->insertItem( tr("Save image"),saveImageFormatMenu ); + + floatimageContextMenu->insertSeparator(); + actionEditCopy->addTo( floatimageContextMenu ); + actionEditCut->addTo( floatimageContextMenu ); + + floatimageContextMenu->insertSeparator(); + a = new QAction( tr( "Use for Export" ), QPixmap(), tr( "Use for Export"), 0, this, "useForExport" ); + a->setToggleAction(true); + connect( a, SIGNAL( activated() ), this, SLOT( editToggleFloatExport() ) ); + a->addTo( floatimageContextMenu); + actionEditToggleFloatExport=a; + + + + // Context menu for exports + exportMenu->insertItem ( tr("Export map as image"),exportImageFormatMenu); + + a = new QAction( tr( "Export as ASCII (still experimental)" ), QPixmap(), tr( "Export (ASCII)" ), 0, this, "exportASCII" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExportASCII() ) ); + a->addTo( exportMenu ); + + a = new QAction( tr( "Export XML" ), QPixmap(), tr( "Export XML" ), 0, this, "exportXML" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExportXML() ) ); + a->addTo( exportMenu ); + + if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) + { + a = new QAction( tr( "Export HTML" ), QPixmap(), tr( "Export HTML" ), 0, this, "exportHTML" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExportHTML() ) ); + a->addTo( exportMenu ); + } + + a = new QAction( tr( "Export XHTML" ), QPixmap(), tr( "Export XHTML" ), ALT + Key_X, this, "exportXHTML" ); + connect( a, SIGNAL( activated() ), this, SLOT( fileExportXHTML() ) ); + a->addTo( exportMenu ); + + + // Context menu for canvas + canvasContextMenu =new QPopupMenu (this); + actionEditMapInfo->addTo( canvasContextMenu ); + canvasContextMenu->insertSeparator(); + actionGroupFormatLinkStyles->addTo( canvasContextMenu ); + canvasContextMenu->insertSeparator(); + actionFormatLinkColorHint->addTo( canvasContextMenu ); + actionFormatLinkColor->addTo( canvasContextMenu ); + actionFormatBackColor->addTo( canvasContextMenu ); + + // Menu for last opened files + // Read settings initially + QString s; + int j=settings.readNumEntry( "/vym/lastMaps/number",0); + for (int i=1;i<=j;i++) + { + s=settings.readEntry(QString("/vym/lastMaps/map-%1").arg(i),""); + if (!s.isEmpty() && j<=maxLastMaps) + lastMaps.append(s); + } + setupLastMapsMenu(); + connect( lastMapsMenu, SIGNAL( activated(int) ), this, SLOT( fileLoadLast(int ) ) ); +} + +void Main::setupLastMapsMenu() +{ + // Remove double entries + QStringList::Iterator it=lastMaps.begin(); + QStringList::Iterator jt; + while (it!=lastMaps.end() ) + { + jt=it; + ++jt; + while (jt!=lastMaps.end() ) + { + if (*it == *jt) + jt=lastMaps.remove(jt); + else + jt++; + } + it++; + } + + // Limit length of list to maxLastMaps + while ((int)(lastMaps.count()) > maxLastMaps) lastMaps.pop_back(); + + // build Menu from lastMaps string list + lastMapsMenu->clear(); + for (it = lastMaps.begin(); it != lastMaps.end(); ++it ) + lastMapsMenu->insertItem (*it ); + +} + +void Main::hideEvent (QHideEvent * ) +{ + if (!textEditor->isMinimized() ) textEditor->hide(); +} + +void Main::showEvent (QShowEvent * ) +{ + if (textEditor->showWithMain()) textEditor->show(); +} + +bool Main::reallyWriteDirectory(const QString &dir) +{ + QStringList eList = QDir(dir).entryList(); + if (eList.first() ==".") eList.pop_front(); // remove "." + if (eList.first() =="..") eList.pop_front(); // remove "." + if (!eList.isEmpty()) + { + QMessageBox mb( "VYM", + tr("The directory ") + dir + + tr(" is not empty. Do you risk to overwrite its contents?"), + QMessageBox::Warning, + QMessageBox::Yes , + QMessageBox::Cancel | QMessageBox::Default, + QMessageBox::QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save + return true; + case QMessageBox::Cancel: + // do nothing + return false; + } + } + return true; +} + +QString Main::browseDirectory (const QString &caption) +{ + QFileDialog fd(this,caption); + fd.setMode (QFileDialog::DirectoryOnly); + fd.setCaption("VYM - "+caption); + fd.show(); + + if ( fd.exec() == QDialog::Accepted ) + return fd.selectedFile(); + else + return ""; +} + +MapEditor* Main::currentMapEditor() const +{ + if ( tabWidget->currentPage() && + tabWidget->currentPage()->inherits( "MapEditor" ) ) + return (MapEditor*)tabWidget->currentPage(); + return NULL; +} + +//TODO not used now, maybe use this for overview window later +void Main::newView() +{ + // Open a new view... have it delete when closed. + Main *m = new Main(0, 0, WDestructiveClose); + qApp->setMainWidget(m); + m->show(); + qApp->setMainWidget(0); +} + +void Main::editorChanged(QWidget *) +{ + // Unselect all possibly selected objects + // (Important to update note editor) + int i; + MapEditor *me; + for (i=0;i<=tabWidget->count() -1;i++) + { + + me=(MapEditor*)tabWidget->page(i); + me->unselect(); + } + currentMapEditor()->reselect(); + + // Update actions to in menus and toolbars according to editor + currentMapEditor()->updateActions(); +} + +void Main::fileNew() +{ + QString fn="unnamed"; + MapEditor* medit = new MapEditor (tabWidget, true); + tabWidget->addTab (medit,fn); + tabWidget->showPage(medit); + medit->viewport()->setFocus(); + medit->select("mc:"); +} + +void Main::fileLoad(QString fn, const LoadMode &lmode) +{ + // Error codes + enum errorCode {success,aborted}; + errorCode err=success; + + // fn is usually the archive, mapfile the file after uncompressing + QString mapfile; + + // Make fn absolute (needed for unzip) + fn=QDir (fn).absPath(); + + MapEditor *me; + + if (lmode==NewMap) + { + // Check, if map is already loaded + int i=0; + while (i<=tabWidget->count() -1) + { + me=(MapEditor*)tabWidget->page(i); + if (me->getFilePath() == fn) + { + // Already there, ask for confirmation + QMessageBox mb( "VYM", + tr("The map ") + fn + tr ("\n is already opened." + "Opening the same map in multiple editors may lead \n" + "to confusion when finishing working with vym." + "Do you want to"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::QMessageBox::NoButton); + mb.setButtonText( QMessageBox::Yes, tr("Open anyway") ); + mb.setButtonText( QMessageBox::Cancel, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // load anyway + i=tabWidget->count(); + break; + case QMessageBox::Cancel: + // do nothing + return; + break; + } + } + i++; + } + } + + + // Try to load map + if ( !fn.isEmpty() ) + { + me = currentMapEditor(); + int tabIndex=tabWidget->currentPageIndex(); + // Check first, if mapeditor exists + // If it is not default AND we want a new map, + // create a new mapeditor in a new tab + if ( lmode==NewMap && (!me || !me->isDefault() ) ) + { + me = new MapEditor (tabWidget,true); + tabWidget->addTab (me,fn); + tabIndex=tabWidget->indexOf (me); + tabWidget->setCurrentPage (tabIndex); + } + + // Check, if file exists (important for creating new files + // from command line + if (!QFile(fn).exists() ) + { + QMessageBox mb( "VYM", + tr("The map") + fn + + tr(" does not exist.\n Do you want to create a new one?"), + QMessageBox::Question, + QMessageBox::Yes , + QMessageBox::Cancel | QMessageBox::Default, + QMessageBox::QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Create")); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // Create new map + currentMapEditor()->setFilePath(fn); + tabWidget->setTabLabel (currentMapEditor(), + currentMapEditor()->getFileName() ); + statusBar()->message( "Created " + fn , statusbarTime ); + return; + + case QMessageBox::Cancel: + // don't create new map + statusBar()->message( "Loading " + fn + " failed!", statusbarTime ); + fileCloseMap(); + return; + } + } + + + //tabWidget->currentPage() won't be NULL here, because of above... + tabWidget->showPage(me); + me->viewport()->setFocus(); + + // Create temporary directory for packing + char tmpdir1[]="/tmp/vym-XXXXXX"; + QString tmpMapDir=mkdtemp(tmpdir1); + + // Try to unzip file + Process *zipProc=new Process (); + zipProc->clearArguments(); + zipProc->setWorkingDirectory (QDir(tmpMapDir)); + zipProc->addArgument ("unzip"); + zipProc->addArgument (fn ); + zipProc->addArgument ("-d"); + zipProc->addArgument (tmpMapDir); + + if (!zipProc->start() ) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("Couldn't start unzip to decompress data.")); + err=aborted; + + } else + { + zipProc->waitFinished(); + if (!zipProc->normalExit() ) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("unzip didn't exit normally") + + zipProc->getErrout() ); + err=aborted; + } else + { + if (zipProc->exitStatus()>0) + { + if (zipProc->exitStatus()==9) + { + // no zipped file, but maybe .xml or old version? Try again. + mapfile=fn; + me->setZipped(false); + } + else + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + QString("unzip exit code: %1").arg(zipProc->exitStatus() ) + + zipProc->getErrout() ); + err=aborted; + } + } else + { // Uncompressing was successfull, + // load from uncompressed temporary directory + + me->setZipped(true); + + + // Look for mapname.xml + mapfile= fn.left(fn.findRev(".",-1,true)); + mapfile=mapfile.section( '/', -1 ); + QFile file( tmpMapDir + "/" + mapfile + ".xml"); + if (!file.exists() ) + { + // mapname.xml does not exist, well, + // maybe some renamed the mapname.vym file... + // Try to find any .xml in the toplevel + // directory of the .vym file + QStringList flist=QDir (tmpMapDir).entryList("*.xml"); + if (flist.count()==1) + { + // Only one entry, take this one + mapfile=tmpMapDir + "/"+flist.first(); + } else + { + for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) + *it=tmpMapDir + "/" + *it; + // FIXME + // Multiple entries, load all (but only the first one into this ME) + //mainWindow->fileLoadFromTmp (flist); + //returnCode=1; // Silently forget this attempt to load + qWarning ("MainWindow::load (fn) multimap found..."); + } + + if (flist.isEmpty() ) + { + QMessageBox::critical( 0, tr( "Critical Load Error" ), + tr("Couldn't find a map (*.xml) in .vym archive.\n")); + err=aborted; + } + } //file doesn't exist + else + mapfile=file.name(); + } // Uncompressing successfull + } + } + + // Finally load map into mapEditor + me->setFilePath (mapfile,fn); + if (me->load(mapfile,lmode)) + err=aborted; + + // Delete tmpDir + system ( "rm -rf "+tmpMapDir); + + // Check for errors + if (err==success) + { + if (lmode==NewMap) + { + me->setFilePath (fn); + tabWidget->changeTab(tabWidget->page(tabIndex), me->getFileName()); + lastMaps.prepend(me->getFilePath() ); + setupLastMapsMenu(); + actionFilePrint->setEnabled (true); + } + statusBar()->message( "Loaded " + fn, statusbarTime ); + return; + } else + { + if (lmode==NewMap) + fileCloseMap(); + } + + + } + statusBar()->message( "Could not load " + fn, statusbarTime ); +} + + +void Main::fileLoad(const LoadMode &lmode) +{ + QFileDialog *fd=new QFileDialog( this); + if (!lastFileDir.isEmpty()) + fd->setDir (lastFileDir); + fd->addFilter ("XML (*.xml)"); + fd->addFilter ("VYM map (*.vym *.vyp)"); + switch (lmode) + { + case NewMap: + fd->setCaption(tr("Load vym map")); + break; + case ImportAdd: + fd->setCaption(tr("Import: Add vym map to selection")); + break; + case ImportReplace: + fd->setCaption(tr("Import: Replace selection with vym map")); + break; + } + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + lastFileDir=fd->dirPath(); + fn = fd->selectedFile(); + fileLoad(fn, lmode); + } +} + +void Main::fileLoad() +{ + fileLoad (NewMap); +} + +void Main::fileLoadLast(int i) +{ + fileLoad(*lastMaps.at(lastMapsMenu->indexOf (i) ),NewMap); +} + +void Main::fileSave(const SaveMode &savemode) +{ + // tmp dir for zipping + QString tmpMapDir; + + // Error codes + enum errorCode {success,aborted}; + errorCode err=success; + + QString safeFilePath; + + bool saveZipped=currentMapEditor()->saveZipped(); + + if (currentMapEditor()) + { + QString fn=currentMapEditor()->getFilePath(); + // filename=unnamed, filepath="" in constructor... + if ( !fn.isEmpty() ) + { + // We have a filepath, go on saving + // First remove existing file, we + // don't want to add to old zip archives + QFile f(fn); + if (f.exists() ) + if (!f.remove()) + QMessageBox::warning( 0, tr( "Save Error" ), + fn+ tr("\ncould not be removed before saving")); + + // Look, if we should zip the data: + if (!saveZipped) + { + QMessageBox mb( "VYM", + tr("The map ") + fn + + tr ("\ndid not use the compressed " + "vym file format.\nWriting it uncompressed will also write images \n" + "and flags and thus may overwrite files in the " + "given directory\n\nDo you want to write the map"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No , + QMessageBox::Cancel | QMessageBox::Escape); + mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") ); + mb.setButtonText( QMessageBox::No, tr("uncompressed") ); + mb.setButtonText( QMessageBox::Cancel, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save compressed (default file format) + saveZipped=true; + break; + case QMessageBox::No: + // save uncompressed + saveZipped=false; + break; + case QMessageBox::Cancel: + // do nothing + return; + break; + } + } + + if (saveZipped) + { + char tmpdir1[]="/tmp/vym-XXXXXX"; + tmpMapDir=mkdtemp(tmpdir1); + + safeFilePath=currentMapEditor()->getFilePath(); + currentMapEditor()->setFilePath (tmpMapDir+"/"+ + currentMapEditor()->getMapName()+ ".xml", + safeFilePath); + currentMapEditor()->save (savemode); + currentMapEditor()->setFilePath (safeFilePath); + + // zip the temporary directory + Process *zipProc=new Process (); + zipProc->clearArguments(); + zipProc->setWorkingDirectory (QDir(tmpMapDir)); + zipProc->addArgument ("zip"); + zipProc->addArgument ("-r"); + zipProc->addArgument (fn); + zipProc->addArgument ("."); + + if (!zipProc->start() ) + { + // zip could not be started + QMessageBox::critical( 0, tr( "Critical Save Error" ), + tr("Couldn't start zip to compress data.")); + err=aborted; + } else + { + // zip could be started + zipProc->waitFinished(); + if (!zipProc->normalExit() ) + { + QMessageBox::critical( 0, tr( "Critical Save Error" ), + tr("zip didn't exit normally")+ + "\n" + zipProc->getErrout()); + err=aborted; + } else + { + if (zipProc->exitStatus()>0) + { + QMessageBox::critical( 0, tr( "Critical Save Error" ), + QString("zip exit code: %1").arg(zipProc->exitStatus() )+ + "\n" + zipProc->getErrout() ); + err=aborted; + } + } + } // zip could be started + } // save zipped + else + { + // Save unzipped. + safeFilePath=currentMapEditor()->getFilePath(); + currentMapEditor()->setFilePath (fn, safeFilePath); + currentMapEditor()->save (savemode); + currentMapEditor()->setFilePath (safeFilePath); + } // save zipped + } // filepath available + else + { + // We have no filepath yet, + // call fileSaveAs() now, this will call fileSave() + // again. + fileSaveAs(savemode); + } + } + + if (currentMapEditor()->saveZipped()) + { + // Delete tmpDir + system ( "rm -rf "+ tmpMapDir ); + } + + if (err==success) + statusBar()->message( + tr("Saved")+" " + currentMapEditor()->getFilePath(), + statusbarTime ); + else + statusBar()->message( + tr("Couldn't save")+" " + currentMapEditor()->getFilePath(), + statusbarTime ); +} + +void Main::fileSave() +{ + fileSave (CompleteMap); +} + +void Main::fileSaveAs(const SaveMode& savemode) +{ + QString tmpMapDir; + QString fn; + + if (currentMapEditor()) + { + if (savemode==CompleteMap) + fn = QFileDialog::getSaveFileName( QString::null, "VYM map (*.vym)", this ); + else + fn = QFileDialog::getSaveFileName( QString::null, "VYM part of map (*.vyp)", this ); + if ( !fn.isEmpty() ) + { + // Check for existing file + if (QFile (fn).exists()) + { + QMessageBox mb( "VYM", + tr("The file ") + fn + tr ("\nexists already. Do you want to"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::QMessageBox::NoButton); + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::Cancel, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save + break; + case QMessageBox::Cancel: + // do nothing + return; + break; + } + } else + { + // New file, add extension to filename, if missing + // This is always .vym or .vyp, depending on savemode + if (savemode==CompleteMap) + { + if (!fn.contains (".vym") && !fn.contains (".xml")) + fn +=".vym"; + } else + { + if (!fn.contains (".vyp") && !fn.contains (".xml")) + fn +=".vyp"; + } + } + + + + + // Save now + currentMapEditor()->setFilePath(fn); + fileSave(savemode); + + // Set name of tab + tabWidget->setTabLabel (currentMapEditor(), + currentMapEditor()->getFileName() ); + return; + } + } +} + +void Main::fileSaveAs() +{ + fileSaveAs (CompleteMap); +} + +void Main::fileImportDir() +{ + if (currentMapEditor()) + currentMapEditor()->importDir(); +} + +void Main::fileExportXML() +{ + if (currentMapEditor()) + { + QString dir=browseDirectory(tr("Export XML to directory")); + if (dir !="" && reallyWriteDirectory(dir) ) + currentMapEditor()->exportXML(dir); + } +} + +void Main::fileExportHTML() +{ + if (currentMapEditor()) + { + ExportHTMLDialog dia(this); + + if (dia.exec()==QDialog::Accepted) + { + QString dir=dia.getDir(); + if (reallyWriteDirectory(dir) ) + { + currentMapEditor()->exportXML (dia.getDir() ); + dia.doExport(currentMapEditor()->getMapName() ); + } + } + } +} + +void Main::fileExportXHTML() +{ + QString dir; + if (currentMapEditor()) + { + ExportXHTMLDialog dia(this); + dia.setFilePath (currentMapEditor()->getFilePath() ); + dia.setMapName (currentMapEditor()->getMapName() ); + dia.readSettings(); + + if (dia.exec()==QDialog::Accepted) + { + QString dir=dia.getDir(); + // Check, if warnings should be used before overwriting + // the output directory + bool ok; + if (dia.warnings()) + ok=reallyWriteDirectory(dir); + else + ok=true; + + if (ok) + { + currentMapEditor()->exportXML (dia.getDir() ); + dia.doExport(currentMapEditor()->getMapName() ); + if (dia.hasChanged()) + currentMapEditor()->setChanged(); + } + } + } +} + +void Main::fileExportImage(int item) +{ + if (currentMapEditor()) + { + QString fn = QFileDialog::getSaveFileName( QString::null, "Image (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *xbm *.xpm)", + this ); + if ( !fn.isEmpty() ) + { + currentMapEditor()->exportImage(fn,item); + } else { + statusBar()->message( tr("Couldn't save") + fn, statusbarTime ); + } + } +} + +void Main::fileExportASCII() +{ + if (currentMapEditor()) + currentMapEditor()->exportASCII(); +} + +void Main::fileCloseMap() +{ + if (currentMapEditor()) + { + if (currentMapEditor()->hasChanged()) + { + QMessageBox mb( "VYM", + tr("The map ") + currentMapEditor()->getFileName() + + tr(" has been modified but not saved yet. Do you want to"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape ); + mb.setButtonText( QMessageBox::Yes, tr("Save modified map before closing it") ); + mb.setButtonText( QMessageBox::No, tr("Discard changes")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save and close + fileSave(CompleteMap); + break; + case QMessageBox::No: + // close without saving + break; + case QMessageBox::Cancel: + // do nothing + return; + } + } + currentMapEditor()->closeMap(); + tabWidget->removePage(currentMapEditor()); + if (tabWidget->count()==0) + actionFilePrint->setEnabled (false); + } +} + +void Main::filePrint() +{ + if (currentMapEditor()) + currentMapEditor()->print(); +} + +void Main::fileExitVYM() +{ + // Check if one or more editors have changed + MapEditor *me; + int i; + for (i=0;i<=tabWidget->count() -1;i++) + { + + me=(MapEditor*)tabWidget->page(i); + + // If something changed, ask what to do + if (me->isUnsaved()) + { + tabWidget->setCurrentPage(i); + QMessageBox mb( "VYM", + tr("This map is not saved yet. Do you want to"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::No, + QMessageBox::Cancel | QMessageBox::Escape ); + mb.setButtonText( QMessageBox::Yes, tr("Save map") ); + mb.setButtonText( QMessageBox::No, tr("Discard changes") ); + mb.show(); + // Call undocumented function: setActiveWindow is only + // possible, if widget is visible. This depends on + // windowmanager... +#if defined(Q_OS_LINUX) + qt_wait_for_window_manager( this); +#endif + mb.setActiveWindow(); + switch( mb.exec() ) { + case QMessageBox::Yes: + // save (the changed editors) and exit + fileSave(CompleteMap); + break; + case QMessageBox::No: + // exit without saving + break; + case QMessageBox::Cancel: + // don't save and don't exit + return; + } + } + } // loop over all MEs + qApp->quit(); +} + +void Main::editUndo() +{ + if (currentMapEditor()) + currentMapEditor()->undo(); +} + +void Main::editRedo() // TODO +{ +} + +void Main::editCopy() +{ + if (currentMapEditor()) + currentMapEditor()->copy(); +} + +void Main::editPaste() +{ + if (currentMapEditor()) + currentMapEditor()->paste(); +} + +void Main::editCut() +{ + if (currentMapEditor()) + currentMapEditor()->cut(); +} + +void Main::editOpenFindWindow() +{ + findWindow->popup(); + findWindow->raise(); + + // Call undocumented function: setActiveWindow is only + // possible, if widget is visible. This depends on + // windowmanager... +#if defined(Q_OS_LINUX) + qt_wait_for_window_manager( this); +#endif + findWindow->setActiveWindow(); +} + +void Main::editFind(QString s) +{ + bool cs=false; + BranchObj *bo=currentMapEditor()->findText(s, cs); + if (bo) + { + statusBar()->message( "Found: " + bo->getHeading(), statusbarTime ); + } else + { + QMessageBox::information( findWindow, tr( "VYM -Information:" ), + tr("No matches found for ")+ + "'<b>"+s+"</b>'"); + } +} + +void Main::editFindChanged() +{ // Notify editor, to abort the current find process + currentMapEditor()->findReset(); +} + +void Main::editOpenURL() +{ + if (currentMapEditor()) + currentMapEditor()->openURL(); +} + +void Main::editURL() +{ + if (currentMapEditor()) + currentMapEditor()->editURL(); +} + +void Main::editHeading2URL() +{ + if (currentMapEditor()) + currentMapEditor()->editHeading2URL(); +} + +void Main::editBugzilla2URL() +{ + if (currentMapEditor()) + currentMapEditor()->editBugzilla2URL(); +} + +void Main::editOpenVymLink() +{ + // Get current path to map + QString currentVymLink; + if (currentMapEditor()) + { + currentVymLink=currentMapEditor()->getVymLink(); + // compare path with already loaded maps + int index=-1; + int i; + MapEditor *me; + for (i=0;i<=tabWidget->count() -1;i++) + { + me=(MapEditor*)tabWidget->page(i); + if (currentVymLink==me->getFilePath() ) + { + index=i; + break; + } + } + if (index<0) + // Load map + { + if (!QFile(currentVymLink).exists() ) + QMessageBox::critical( 0, tr( "Critical Error" ), + tr("Couldn't open map " +currentVymLink)+"."); + else + { + fileLoad (currentVymLink, NewMap); + tabWidget->setCurrentPage (tabWidget->count()-1); + } + } else + // Go to tab containing the map + tabWidget->setCurrentPage (index); + } +} + +void Main::editVymLink() +{ + if (currentMapEditor()) + currentMapEditor()->editVymLink(); +} + +void Main::editDeleteVymLink() +{ + if (currentMapEditor()) + currentMapEditor()->deleteVymLink(); +} + +void Main::editMapInfo() +{ + if (currentMapEditor()) + currentMapEditor()->editMapInfo(); +} + +void Main::editMoveUp() +{ + if (currentMapEditor()) + currentMapEditor()->moveBranchUp(); +} + +void Main::editMoveDown() +{ + if (currentMapEditor()) + currentMapEditor()->moveBranchDown(); +} + +void Main::editToggleScroll() +{ + if (currentMapEditor()) + { + currentMapEditor()->toggleScroll(); + } +} + +void Main::editUnScrollAll() +{ + if (currentMapEditor()) + { + currentMapEditor()->unScrollAll(); + } +} + +void Main::editHeading() +{ + if (currentMapEditor()) + currentMapEditor()->editHeading(); +} + +void Main::editNewBranch() +{ + if (currentMapEditor()) + currentMapEditor()->addNewBranch(0); +} + +void Main::editNewBranchAbove() +{ + if (currentMapEditor()) + currentMapEditor()->addNewBranch(-1); +} + +void Main::editNewBranchBelow() +{ + if (currentMapEditor()) + currentMapEditor()->addNewBranch(1); +} + +void Main::editImportAdd() +{ + fileLoad (ImportAdd); +} + +void Main::editImportReplace() +{ + fileLoad (ImportReplace); +} + +void Main::editSaveBranch() +{ + fileSaveAs (PartOfMap); +} + +void Main::editDeleteSelection() +{ + if (currentMapEditor()) + currentMapEditor()->deleteSelection(); +} + +void Main::editUpperBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectUpperBranch(); +} + +void Main::editLowerBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectLowerBranch(); +} + +void Main::editLeftBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectLeftBranch(); +} + +void Main::editRightBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectRightBranch(); +} + +void Main::editFirstBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectFirstBranch(); +} + +void Main::editLastBranch() +{ + if (currentMapEditor()) + currentMapEditor()->selectLastBranch(); +} + +void Main::editLoadImage() +{ + if (currentMapEditor()) + currentMapEditor()->loadFloatImage(); +} + +void Main::editSaveImage(int item) +{ + if (currentMapEditor()) + currentMapEditor()->saveFloatImage(item); +} + +void Main::editToggleFloatExport() +{ + if (currentMapEditor()) + currentMapEditor()->toggleFloatExport(); +} + +void Main::formatSelectColor() +{ + if (currentMapEditor()) + { + QColor col = QColorDialog::getColor( currentMapEditor()->color(), this ); + if ( !col.isValid() ) return; + currentMapEditor()->setColor( col ); + colorChanged( col ); + } +} + +void Main::formatPickColor() +{ + if (currentMapEditor()) + colorChanged( currentMapEditor()->pickColor() ); +} + +void Main::colorChanged(QColor c) +{ + QPixmap pix( 16, 16 ); + pix.fill( c ); + actionFormatColor->setIconSet( pix ); +} + +void Main::formatColorItem() +{ + if (currentMapEditor()) + currentMapEditor()->colorItem(); +} + +void Main::formatColorBranch() +{ + if (currentMapEditor()) + currentMapEditor()->colorBranch(); +} + +void Main::formatLinkStyleLine() +{ + if (currentMapEditor()) + currentMapEditor()->setLinkStyle(StyleLine); +} + +void Main::formatLinkStyleParabel() +{ + if (currentMapEditor()) + currentMapEditor()->setLinkStyle(StyleParabel); +} + +void Main::formatLinkStylePolyLine() +{ + if (currentMapEditor()) + currentMapEditor()->setLinkStyle(StylePolyLine); +} + +void Main::formatLinkStylePolyParabel() +{ + if (currentMapEditor()) + currentMapEditor()->setLinkStyle(StylePolyParabel); +} + +void Main::formatSelectBackColor() +{ + if (currentMapEditor()) + currentMapEditor()->selectBackgroundColor(); +} + +void Main::formatSelectLinkColor() +{ + if (currentMapEditor()) + currentMapEditor()->selectLinkColor(); +} + +void Main::formatToggleLinkColorHint() +{ + currentMapEditor()->toggleLinkColorHint(); +} + +void Main::formatFrameNone() +{ + if (currentMapEditor()) + currentMapEditor()->setFrame(NoFrame); +} + +void Main::formatFrameRectangle() +{ + if (currentMapEditor()) + currentMapEditor()->setFrame(Rectangle); +} + +void Main::viewZoomReset() +{ + if (currentMapEditor()) + { + QWMatrix m; + m.reset(); + currentMapEditor()->setWorldMatrix( m ); + currentMapEditor()->setViewCenter(); + currentMapEditor()->adjustCanvasSize(); + } +} + +void Main::viewZoomIn() +{ + if (currentMapEditor()) + { + QWMatrix m = currentMapEditor()->worldMatrix(); + m.scale( 1.25, 1.25 ); + currentMapEditor()->setWorldMatrix( m ); + currentMapEditor()->setViewCenter(); + currentMapEditor()->adjustCanvasSize(); + } +} + +void Main::viewZoomOut() +{ + if (currentMapEditor()) + { + QWMatrix m = currentMapEditor()->worldMatrix(); + m.scale( 0.8, 0.8 ); + currentMapEditor()->setWorldMatrix( m ); + currentMapEditor()->setViewCenter(); + currentMapEditor()->adjustCanvasSize(); + } +} +bool Main::settingsPDF() +{ + // Default browser is set in constructor + bool ok; + QString text = QInputDialog::getText( + "VYM", tr("Enter path for pdf reader:"), QLineEdit::Normal, + settings.readEntry("/vym/mainwindow/readerPDF"), &ok, this ); + if (ok) + settings.writeEntry ("/vym/mainwindow/readerPDF",text); + return ok; +} + + +bool Main::settingsURL() +{ + // Default browser is set in constructor + bool ok; + QString text = QInputDialog::getText( + "VYM", tr("Enter path for application to open an URL:"), QLineEdit::Normal, + settings.readEntry("/vym/mainwindow/readerURL") + , &ok, this ); + if (ok) + settings.writeEntry ("/vym/mainwindow/readerURL",text); + return ok; +} + +void Main::windowToggleNoteEditor() +{ + if (textEditor->showWithMain() ) + windowHideNoteEditor(); + else + windowShowNoteEditor(); +} + +void Main::windowShowNoteEditor() +{ + textEditor->setShowWithMain(true); + textEditor->show(); + actionViewToggleNoteEditor->setOn (true); +} + +void Main::windowHideNoteEditor() +{ + textEditor->setShowWithMain(false); + textEditor->hide(); + actionViewToggleNoteEditor->setOn (false); +} + +void Main::windowNextEditor() +{ + if (tabWidget->currentPageIndex() < tabWidget->count()) + tabWidget->setCurrentPage (tabWidget->currentPageIndex() +1); +} + +void Main::windowPreviousEditor() +{ + if (tabWidget->currentPageIndex() >0) + tabWidget->setCurrentPage (tabWidget->currentPageIndex() -1); +} + +void Main::standardFlagChanged() +{ + currentMapEditor()->toggleStandardFlag(sender()->name()); +} + +void Main::testFunction() +{ + //textEditor->stackUnder(this); + currentMapEditor()->testFunction(); +} + +void Main::testShowClipboard() +{ + clipboardME->show(); +} + +void Main::helpDoc() +{ + QString docpath; + // default path in SUSE LINUX + docpath="/usr/share/doc/packages/vym/doc/vym.pdf"; + + if (!QFile (docpath).exists() ) + { + // relative path for easy testing in tarball + docpath="doc/vym.pdf"; + if (!QFile (docpath).exists() ) + { + // relative path for testing while still writing vym.tex + docpath="doc/tex/vym.pdf"; + if (!QFile (docpath).exists() ) + { + QMessageBox::critical(0, + tr("Critcal error"), + tr("Couldn't find the documentation\n" + "vym.pdf in various places.")); + return; + } + } + } + + Process *pdfProc = new Process(); + pdfProc->clearArguments(); + pdfProc->addArgument( settings.readEntry("/vym/mainwindow/readerPDF")); + pdfProc->addArgument( docpath); + + if ( !pdfProc->start() ) + { + // error handling + QMessageBox::critical(0, + tr("Critcal error"), + tr("Couldn't find a viewer to read vym.pdf.\n" + "Please use Settings->")+tr("Set application to open pdf files")); + return; + } +} + + +void Main::helpAbout() +{ + static QMessageBox* about = new QMessageBox( "VYM", + "<h3>VYM - View Your Mind </h3>" + "<p> A tool to put the things you have got in your mind into a map.</p>" + "<ul>" + "<li> (c) by Uwe Drechsel (vym@InSilmaril.de)</li>" + "<li> vym is released under the GPL (Gnu General Public License)" + ", with one exception (see the file \"LICENSE\"which " + "comes with vym). This exception is needed to build vym with QT libraries for proprietary operating systems.</li>" + "<li> Project homepage <a href=\"http:/www.InSilmaril.de/vym\">" + "http:/www.InSilmaril.de/vym</a></li>" + "<li> Credits " + "<ul>" + "<li>Thomas Schraitle for the stylesheet used for XHTML-export </li>" + "<li>Clemens Kraus for stylesheets and script used for HTML-export " + "<a href=\"http://www.clemens-kraus.de\">(www.clemens-kraus.de)</a></li>" + "<li>Alexander Johannesen for providing stylesheets from his xsiteable project " + "<a href=\"http://www.shelter.nu/xsiteable/xsiteable.html\">(www.shelter.nu/xsiteable/xsiteable.html)</a>. </li>" + "<li>Ken Wimer and Olaf Hering for Mac support</li>" + "</ul>" + "</li>" + "<li> Version " __VYM_VERSION__ "</li>" + "<li> Build date " __BUILD_DATE__"</li>" + "</ul>", QMessageBox::Information, 1, 0, 0, this, 0, FALSE ); + about->setButtonText( 1, "Dismiss" ); + about->setMinimumSize(QSize(300,300)); + about->setIconPixmap (QPixmap(vym_logo_xpm)); + about->show(); +} + +void Main::helpAboutQT() +{ + QMessageBox::aboutQt( this, "Qt Application Example" ); +} + diff -r 000000000000 -r 7a96bd401351 mainwindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mainwindow.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,168 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <qpopupmenu.h> +#include <qmainwindow.h> +#include <qtextedit.h> +#include <qintdict.h> +#include <qcanvas.h> +#include <qlineedit.h> +#include <qaction.h> +#include <qcursor.h> +#include <qtabwidget.h> +#include <qmap.h> + +#include "xml.h" +#include "texteditor.h" +#include "mapeditor.h" +#include "findwindow.h" + +class Main : public QMainWindow +{ + Q_OBJECT + +public: + Main(QWidget* parent=0, const char* name=0, WFlags f=0); + ~Main(); + void loadCmdLine(); + void statusMessage (const QString &); + +public slots: + void fileNew(); + +protected: + void closeEvent( QCloseEvent* ); + +private: + void setupFileActions(); + void setupEditActions(); + void setupFormatActions(); + void setupViewActions(); + void setupWindowActions(); + void setupFlagActions(); + void setupSettingsActions(); + void setupTestActions(); + void setupHelpActions(); + void setupContextMenus(); + void setupLastMapsMenu(); + void hideEvent (QHideEvent * ); + void showEvent (QShowEvent * ); + bool reallyWriteDirectory(const QString&); + QString browseDirectory(const QString&); + MapEditor* currentMapEditor() const; + +private slots: + void newView(); + void editorChanged(QWidget*); + + void fileLoad(QString ,const LoadMode &); + void fileLoad(const LoadMode &); + void fileLoad(); + void fileLoadLast(int); + void fileSave(const SaveMode & ); + void fileSave(); + void fileSaveAs(const SaveMode &); + void fileSaveAs(); + void fileImportDir(); + void fileExportXML(); + void fileExportHTML(); + void fileExportXHTML(); + void fileExportImage(int); + void fileExportASCII(); + void fileCloseMap(); + void filePrint(); + void fileExitVYM(); + + void editUndo(); + void editRedo(); + void editCopy(); + void editPaste(); + void editCut(); + void editOpenFindWindow(); + void editFind(QString); + void editFindChanged(); +public slots: + void editOpenURL(); +private slots: + void editURL(); + void editHeading2URL(); + void editBugzilla2URL(); + void editVymLink(); +public slots: + void editOpenVymLink(); +private slots: + void editDeleteVymLink(); + void editMapInfo(); + void editMoveUp(); + void editMoveDown(); + void editToggleScroll(); + void editUnScrollAll(); + void editHeading(); + void editNewBranch(); + void editNewBranchAbove(); + void editNewBranchBelow(); + void editImportAdd(); + void editImportReplace(); + void editSaveBranch(); + void editDeleteSelection(); + void editUpperBranch(); + void editLowerBranch(); + void editLeftBranch(); + void editRightBranch(); + void editFirstBranch(); + void editLastBranch(); + void editLoadImage(); + void editSaveImage(int); + void editToggleFloatExport(); + + void formatSelectColor(); + void formatPickColor(); + void colorChanged(QColor); + void formatColorItem(); + void formatColorBranch(); + void formatLinkStyleLine(); + void formatLinkStyleParabel(); + void formatLinkStylePolyLine(); + void formatLinkStylePolyParabel(); + void formatSelectBackColor(); + void formatSelectLinkColor(); + void formatToggleLinkColorHint(); + void formatFrameNone(); + void formatFrameRectangle(); + + void viewZoomReset(); + void viewZoomIn(); + void viewZoomOut(); + +public slots: + bool settingsPDF(); + bool settingsURL(); + + void windowToggleNoteEditor(); +private slots: + void windowNextEditor(); + void windowPreviousEditor(); + void windowShowNoteEditor(); + void windowHideNoteEditor(); + + void standardFlagChanged(); + + void testFunction(); + void testShowClipboard(); + + void helpDoc(); + void helpAbout(); + void helpAboutQT(); + +private: + QCanvas* canvas; + QTabWidget *tabWidget; + FindWindow *findWindow; + QStringList lastMaps; + int maxLastMaps; + QString lastFileDir; +}; + + +#endif + diff -r 000000000000 -r 7a96bd401351 mapcenterobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapcenterobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,235 @@ +#include <qdatetime.h> + +#include "mapcenterobj.h" +#include "floatimageobj.h" +#include "mapeditor.h" + +///////////////////////////////////////////////////////////////// +// MapCenterObj +///////////////////////////////////////////////////////////////// +MapCenterObj::MapCenterObj() : BranchObj () +{ +// cout << "Const MapCenterObj\n"; + init(); +} + +MapCenterObj::MapCenterObj(QCanvas* c) : BranchObj (c) +{ +// cout << "Const MapCenterObj canvas="<<c<<"\n"; + init(); +} + +MapCenterObj::~MapCenterObj() +{ +// cout << "Destr MapCenterObj\n"; +} + +void MapCenterObj::clear() +{ + BranchObj::clear(); + init(); +} + +void MapCenterObj::init () +{ + orientation=OrientUndef; + absPos=QPoint (canvas->width()/2, canvas->height()/2); + + // FIXME this should be done in TextObj later... + QFont font ("Sans Serif,16,-1,5,50,0,0,0,0,0"); + heading->setFont(font); + + branch.setAutoDelete (TRUE); + floatimage.setAutoDelete (TRUE); + + move (absPos.x(), absPos.y() ); + depth=0; + + scrolled=false; + tmpUnscrolled=false; + + frame->setFrameType (Rectangle); +} + +void MapCenterObj::move (double x, double y) +{ + BranchObj::move(x,y); + positionBBox(); +} + +void MapCenterObj::moveBy (double x, double y) +{ + BranchObj::moveBy(x,y); + positionBBox(); +} + +void MapCenterObj::moveAll (double x, double y) +{ + // Get rel. position + double dx=x-absPos.x(); + double dy=y-absPos.y(); + + // Move myself and branches + moveAllBy (dx,dy); +} + +void MapCenterObj::moveAllBy (double dx, double dy) +{ + // Move myself + moveBy(dx,dy); + + positionBBox(); +} + +void MapCenterObj::updateLink() +{ + // set childPos to middle of MapCenterObj + childPos=QPoint( + absPos.x() + QSize(getSize() ).width()/2, + absPos.y() + QSize(getSize() ).height()/2); + parPos=childPos; + BranchObj *b; + for (b=branch.first(); b; b=branch.next() ) + b->updateLink(); +} + +LinkableMapObj* MapCenterObj::findMapObj(QPoint p, LinkableMapObj *excludeLMO) + { + BranchObj *bo; + LinkableMapObj *lmo; + + // Search through child branches + for (bo=branch.first(); bo; bo=branch.next() ) + { + lmo = bo->findMapObj(p, excludeLMO); + + if (lmo!= NULL) + { + return lmo; + } + } + // is p in MapCenter? + if (inBBox (p) && (this != excludeLMO) ) return this; + + // Search float images + FloatImageObj *foi; + for (foi=floatimage.first(); foi; foi=floatimage.next() ) + if (foi->inBBox(p) && (foi != excludeLMO) && foi->getParObj()!= excludeLMO) return foi; + + // nothing found + return NULL; +} + +QString MapCenterObj::saveToDir (const QString &tmpdir,const QString &prefix, int verbose, const QPoint &offset) +{ + QString s,a; + + // save area, if not scrolled + QString areaAttr= + attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) + + attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) + + attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) + + attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10)); + + s=beginElement ("mapcenter" + +attribut("absPosX",QString().setNum(absPos.x(),10)) + +attribut("absPosY",QString().setNum(absPos.y(),10)) + +attribut("frameType",frame->getFrameTypeName()) + +areaAttr + ); + + incIndent(); + if (heading->getColor()!=QColor("black")) + a=attribut ("textColor",QColor(heading->getColor()).name() ); + else + a=""; + + // Save flags. If verbose is set (export to xml dir), also write + // the flags as picture + s+=standardFlags->saveToDir(tmpdir+"/flags", "/standardFlag-", verbose); + s=s+valueElement("heading", getHeading(),a); + + // Reset the counters before saving + FloatImageObj (canvas).resetSaveCounter(); + + // add link to file in s + if (!note.isEmpty() ) + s+=note.saveToDir(); + + // Save FloatImages + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next() ) + s+=fio->saveToDir (tmpdir,prefix); + + // Save branches + BranchObj *bo; + for (bo=branch.first(); bo; bo=branch.next() ) + s+=bo->saveToDir(tmpdir,prefix, offset); + + decIndent(); + s+=endElement ("mapcenter"); + return s; +} + +void MapCenterObj::setVersion (const QString &s) +{ + version=s; +} + +bool MapCenterObj::checkVersion () +{ + // returns true, if vym is able to read file regarding + // the version set with setVersion + QString s1=version.section (".",0,0); + QString s2=version.section (".",1,1); + QString s3=version.section (".",2,2); + bool ok; + int vv1 =QString(__VYM_VERSION__).section (".",0,0).toInt(&ok,10); + int vv2 =QString(__VYM_VERSION__).section (".",1,1).toInt(&ok,10); + int vv3 =QString(__VYM_VERSION__).section (".",2,2).toInt(&ok,10); + int mv1=0; + int mv2=0; + int mv3=0; + if (!s1.isEmpty() ) mv1=s1.toInt(&ok,10); + if (!s2.isEmpty() ) mv2=s2.toInt(&ok,10); + if (!s3.isEmpty() ) mv3=s3.toInt(&ok,10); + + if (vv1 > mv1) + return true; + if (vv1 < mv1) + return false; + if (vv2 > mv2) + return true; + if (vv2 < mv2) + return false; + if (vv3 > mv3) + return true; + if (vv3 < mv3) + return false; + return true; +} + +void MapCenterObj::setAuthor (const QString &s) +{ + author=s; +} + +QString MapCenterObj::getAuthor() +{ + return author; +} + +void MapCenterObj::setComment (const QString &s) +{ + comment=s; +} + +QString MapCenterObj::getComment () +{ + return comment; +} + +QString MapCenterObj::getDate () +{ + return QDate::currentDate().toString ("yyyy-MM-dd"); +} diff -r 000000000000 -r 7a96bd401351 mapcenterobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapcenterobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,35 @@ +#ifndef MAPCENTEROBJ_H +#define MAPCENTEROBJ_H + +#include "branchobj.h" +#include "version.h" + +///////////////////////////////////////////////////////////////////////////// +class MapCenterObj:public BranchObj { +public: + MapCenterObj (); + MapCenterObj (QCanvas*); + ~MapCenterObj (); + void clear(); + void init(); + virtual void move (double,double); + virtual void moveBy (double,double); + virtual void moveAll (double,double); + virtual void moveAllBy (double,double); + virtual void updateLink(); + LinkableMapObj* findMapObj(QPoint,LinkableMapObj*); // find MapObj + virtual QString saveToDir (const QString&,const QString&,int, const QPoint&);// Save data recursivly to tempdir + void setVersion(const QString &); + bool checkVersion(); // check if program version is higher than saved version + void setAuthor (const QString &); + QString getAuthor (); + void setComment (const QString &); + QString getComment (); + QString getDate(); +private: + QString version; // version string saved in vym file + QString author; + QString comment; + QDate date; +}; +#endif diff -r 000000000000 -r 7a96bd401351 mapeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapeditor.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,3062 @@ +#include "mapeditor.h" + +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qapplication.h> +#include <qpainter.h> +#include <qpopupmenu.h> +#include <qprinter.h> +#include <qpaintdevicemetrics.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qdir.h> +#include <qcolor.h> +#include <qcolordialog.h> +#include <qbitmap.h> +#include <qprocess.h> +#include <qinputdialog.h> + +#include <iostream> +#include <stdlib.h> +#include <typeinfo> + +#include "version.h" + +#include "xml.h" +#include "texteditor.h" +#include "linkablemapobj.h" +#include "exports.h" +#include "misc.h" +#include "mainwindow.h" +#include "extrainfodialog.h" +#include "settings.h" + +#include "icons/flag-note.xpm" +#include "icons/flag-url.xpm" +#include "icons/flag-vymlink.xpm" +#include "icons/flag-scrolled-right.xpm" +#include "icons/flag-tmpUnscrolled-right.xpm" +#include "icons/flag-questionmark.xpm" +#include "icons/flag-exclamationmark.xpm" +#include "icons/flag-hook-green.xpm" +#include "icons/flag-cross-red.xpm" +#include "icons/flag-stopsign.xpm" +#include "icons/flag-smiley-good.xpm" +#include "icons/flag-smiley-sad.xpm" +#include "icons/flag-clock.xpm" +#include "icons/flag-lamp.xpm" +#include "icons/flag-arrow-up.xpm" +#include "icons/flag-arrow-down.xpm" +#include "icons/flag-thumb-up.xpm" +#include "icons/flag-thumb-down.xpm" +#include "icons/flag-heart.xpm" +#include "icons/flag-flash.xpm" +#include "icons/flag-lifebelt.xpm" + +extern TextEditor *textEditor; +extern int statusbarTime; +extern Main *mainWindow; +extern FlagRowObj *systemFlagsDefault; +extern FlagRowObj *standardFlagsDefault; +extern MapEditor *clipboardME; + +extern QAction *actionFileSave; +extern QAction *actionEditUndo; +extern QAction *actionEditCopy; +extern QAction *actionEditCut; +extern QAction *actionEditPaste; +extern QAction *actionEditMoveUp; +extern QAction *actionEditMoveDown; +extern QAction *actionEditToggleScroll; +extern QAction *actionEditOpenURL; +extern QAction *actionEditURL; +extern QAction *actionEditHeading2URL; +extern QAction *actionEditBugzilla2URL; +extern QAction *actionEditOpenVymLink; +extern QAction *actionEditVymLink; +extern QAction *actionEditDeleteVymLink; +extern QAction *actionEditHeading; +extern QAction *actionEditDelete; +extern QAction *actionEditAddBranch; +extern QAction *actionEditAddBranchAbove; +extern QAction *actionEditAddBranchBelow; +extern QAction *actionEditImportAdd; +extern QAction *actionEditImportReplace; +extern QAction *actionEditSaveBranch; +extern QAction *actionEditSelectFirst; +extern QAction *actionEditSelectLast; +extern QAction *actionEditLoadImage; +extern QAction *actionEditToggleFloatExport; + +extern QAction* actionFormatPickColor; +extern QAction* actionFormatColorBranch; +extern QAction* actionFormatColorSubtree; +extern QAction *actionFormatLinkColorHint; +extern QAction *actionFormatBackColor; +extern QAction *actionFormatLinkColor; + +extern QActionGroup *actionGroupFormatFrameTypes; +extern QAction *actionFormatFrameNone; +extern QAction *actionFormatFrameRectangle; + +extern QActionGroup *actionGroupFormatLinkStyles; +extern QAction *actionFormatLinkStyleLine; +extern QAction *actionFormatLinkStyleParabel; +extern QAction *actionFormatLinkStylePolyLine; +extern QAction *actionFormatLinkStylePolyParabel; + +extern QAction *actionViewToggleNoteEditor; + +extern QAction *actionSettingsAutoedit; +extern QAction *actionSettingsAutoselectHeading; +extern QAction *actionSettingsAutoselectText; +extern QAction *actionSettingsPasteNewHeading; + +extern QPopupMenu *branchContextMenu; +extern QPopupMenu *floatimageContextMenu; +extern QPopupMenu *saveImageFormatMenu; +extern QPopupMenu *exportImageFormatMenu; +extern QPopupMenu *canvasContextMenu; + +extern Settings settings; + + +/////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////// +MapEditor::MapEditor( + QWidget* parent, bool interactive, const char* name, WFlags f) : + QCanvasView(parent,name,f) +{ + //cout << "Constructor ME "<<this<<endl; + + mapCanvas = new QCanvas(1000,800); + mapCanvas->setAdvancePeriod(30); + + setCanvas (mapCanvas); + + setVScrollBarMode ( QScrollView::AlwaysOn ); + setHScrollBarMode ( QScrollView::AlwaysOn ); + + // Now create the _global_ system flags _once_: + // (Later all OrnamentedObj copy from this + // and set their own canvas) + if (!systemFlagsDefault) + { + systemFlagsDefault = new FlagRowObj (mapCanvas); + systemFlagsDefault->setVisibility (false); + systemFlagsDefault->setName ("systemFlagsDef"); + + FlagObj *fo = new FlagObj (mapCanvas); + fo->load(QPixmap(flag_note_xpm)); + fo->setName("note"); + fo->setToolTip(tr("Note")); + systemFlagsDefault->addFlag (fo); // makes deep copy + + fo->load(QPixmap(flag_url_xpm)); + fo->setName("url"); + fo->setToolTip(tr("WWW Document (external)")); + systemFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_vymlink_xpm)); + fo->setName("vymLink"); + fo->setToolTip(tr("Link to another vym map")); + systemFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_scrolled_right_xpm)); + fo->setName("scrolledright"); + fo->setToolTip(tr("subtree is scrolled")); + systemFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_tmpUnscrolled_right_xpm)); + fo->setName("tmpUnscrolledright"); + fo->setToolTip(tr("subtree is temporary scrolled")); + systemFlagsDefault->addFlag (fo); + delete (fo); + } + if (!standardFlagsDefault) + { + standardFlagsDefault = new FlagRowObj (mapCanvas); + standardFlagsDefault->setVisibility (false); + standardFlagsDefault->setName ("standardFlagsDef"); + + FlagObj *fo = new FlagObj (mapCanvas); + fo->load(QPixmap(flag_exclamationmark_xpm)); + fo->setName("exclamationmark"); + fo->setToolTip(tr("Take care!")); + standardFlagsDefault->addFlag (fo); // makes deep copy + + fo->load(QPixmap(flag_questionmark_xpm)); + fo->setName("questionmark"); + fo->setToolTip(tr("Really?")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_hook_green_xpm)); + fo->setName("hook-green"); + fo->setToolTip(tr("ok!")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_cross_red_xpm)); + fo->setName("cross-red"); + fo->setToolTip(tr("Not ok!")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_stopsign_xpm)); + fo->setName("stopsign"); + fo->setToolTip(tr("This won't work!")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_smiley_good_xpm)); + fo->setName("smiley-good"); + fo->setToolTip(tr("Good")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_smiley_sad_xpm)); + fo->setName("smiley-sad"); + fo->setToolTip(tr("Bad")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_clock_xpm)); + fo->setName("clock"); + fo->setToolTip(tr("Time critical")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_lamp_xpm)); + fo->setName("lamp"); + fo->setToolTip(tr("Idea!")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_arrow_up_xpm)); + fo->setName("arrow-up"); + fo->setToolTip(tr("Important")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_arrow_down_xpm)); + fo->setName("arrow-down"); + fo->setToolTip(tr("Unimportant")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_thumb_up_xpm)); + fo->setName("thumb-up"); + fo->setToolTip(tr("I like this")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_thumb_down_xpm)); + fo->setName("thumb-down"); + fo->setToolTip(tr("I do not like this")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_heart_xpm)); + fo->setName("heart"); + fo->setToolTip(tr("I just love... ")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_flash_xpm)); + fo->setName("flash"); + fo->setToolTip(tr("Dangerous")); + standardFlagsDefault->addFlag (fo); + + fo->load(QPixmap(flag_lifebelt_xpm)); + fo->setName("lifebelt"); + fo->setToolTip(tr("This will help")); + standardFlagsDefault->addFlag (fo); + delete (fo); + + } + + mapCenter = new MapCenterObj(mapCanvas); + mapCenter->setVisibility (true); + mapCenter->setMapEditor (this); + mapCenter->setHeading (tr("New Map")); + + printer=NULL; + + lineedit = new QLineEdit(this, "lineedit" ); + connect( lineedit, SIGNAL( returnPressed() ), SLOT( finishedLineEditNoSave() ) ); + lineedit->hide(); + + actColor=black; setColor (actColor); + deflinkcolor=QColor (0,0,255); + linkcolorhint=DefaultColor; + linkstyle=StylePolyParabel; + mapCanvas->setBackgroundColor (white); + + // Create bitmap cursors, patform dependant + #if defined(Q_OS_MACX) + #include "icons/cursorhandopen16.xpm" + #include "icons/cursorcolorpicker16.xpm" + QBitmap cb( 16, 16, chandopen, TRUE ); + QBitmap cm( 16, 16, chandopenmask, TRUE ); + handOpenCursor=QCursor ( cb, cm ); + // set hot spot to tip of picker + pickColorCursor=QCursor ( cursorcolorpicker_xpm, 1,15 ); + #else + #include "icons/cursorhandopen.xpm" + #include "icons/cursorcolorpicker.xpm" + + QBitmap cb( 32, 32, chandopen, TRUE ); + QBitmap cm( 32, 32, chandopenmask, TRUE ); + handOpenCursor=QCursor ( cb, cm ); + // set hot spot to tip of picker + pickColorCursor=QCursor ( cursorcolorpicker_xpm, 5,27 ); + #endif + + + pickingColor=false; + + editingBO=NULL; + selection=NULL; + selectionLast=NULL; + movingObj=NULL; + + mapChanged=false; + mapDefault=true; + mapUnsaved=false; + undoSelection=NULL; + + zipped=true; + filePath=""; + fileName="unnamed"; + mapName=""; + + // Initialize find routine + itFind=NULL; + EOFind=false; + + printFrame=true; + printFooter=true; + + blockreposition=false; + isInteractive=interactive; + if (isInteractive) + // Create temporary files + makeTmpDirs(); + + // Initially set movingCentre + updateViewCenter(); + + mapCenter->reposition(); // for positioning heading +} + +MapEditor::~MapEditor() +{ + //cout <<"Destructor MapEditor\n"; + if (isInteractive) delTmpDirs(); + + // Save Settings + //settings.writeEntry( "/vym/mapeditor/editmode/autoselect", ); + +} + +QColor MapEditor::color() +{ + return actColor; +} + +QColor MapEditor::backgroundColor() +{ + return mapCanvas->backgroundColor(); +} + +MapCenterObj* MapEditor::getMapCenter() +{ + return mapCenter; +} + +QCanvas* MapEditor::getCanvas() +{ + return mapCanvas; +} + +void MapEditor::adjustCanvasSize() +{ + // To adjust the canvas to map, viewport size and position, we have to + // do some coordinate magic... + // + // Get rectangle of (scroll-)view. + // We want to be in canvas coords, so + // we map. Important if view is zoomed... + QRect view = inverseWorldMatrix().mapRect( QRect( contentsX(), contentsY(), + visibleWidth(), visibleHeight()) ); + + // Now we need the bounding box of view AND map to calc the correct canvas size. + // Why? Because if the map itself is moved out of view, the view has to be enlarged + // to avoid jumping aroung... + QRect map=mapCenter->getTotalBBox(); + + // right edge - left edge + int cw= max(map.x() + map.width(), view.x() + view.width()) - min(map.x(), view.x()); + int ch= max(map.y() + map.height(), view.y() + view.height()) - min(map.y(), view.y()); + + + if ( (cw!=mapCanvas->width()) || (ch!=mapCanvas->height()) || + !mapCanvas->onCanvas (map.topLeft()) || !mapCanvas->onCanvas (map.bottomRight()) + ) + { + // move the map on canvas (in order to not move it on screen) this is neccessary + // a) if topleft corner of canvas is left or above topleft corner of view and also left of + // above topleft corner of map. E.g. if map is completly inside view, but it would be possible + // to scroll to an empty area of canvas to the left. + // b) if topleft corner of map left of or above topleft of canvas + int dx=0; + int dy=0; + + if (cw > mapCanvas->width() ) + { + if (map.x()<0) dx=-map.x(); + } + if (cw < mapCanvas->width() ) + dx=-min (view.x(),map.x()); + if (ch > mapCanvas->height() ) + { + if (map.y()<0) dy=-map.y(); + } + if (ch < mapCanvas->height() ) + { + dy=-min (view.y(),map.y()); + } + // We really have to resize now. Let's go... + mapCanvas->resize (cw,ch); + if ( (dx!=0) || (dy!=0) ) + { + mapCenter->moveAllBy(dx,dy); + mapCenter->reposition(); + + // scroll the view (in order to not move map on screen) + scrollBy (dx,dy); + } + } +} + +bool MapEditor::blockReposition() +{ + return blockreposition; +} + +void MapEditor::makeTmpDirs() +{ + // Create unique temporary directories + char tmpdir[]="/tmp/vym-XXXXXX"; + bakMapDir=mkdtemp(tmpdir); + makeSubDirs(bakMapDir); + // FIXME set permissions + // and maybe use QT method for portability +} + +void MapEditor::delTmpDirs() +{ + //FIXME delete tmp directory, better use QT methods here: + system ( "rm -rf "+ bakMapDir ); +} + + +void MapEditor::makeSubDirs(const QString &s) +{ + QDir d(s); + d.mkdir ("images"); + d.mkdir ("flags"); +} + + +QString MapEditor::saveToDir(const QString &tmpdir, const QString &prefix, bool writeflags, const QPoint &offset, SaveMode savemode) +{ + // tmpdir temporary directory to which data will be writte + // prefix mapname, which will be appended to images etc. + // writeflags Only write flags for "real" save of map, not undo + // offset offset of bbox of whole map in canvas. + // Needed for XML export + // completeMap if false, only vympart will be written, without + // mapcenter + + // Save Header + QString ls; + switch (linkstyle) + { + case StyleLine: + ls="StyleLine"; + break; + case StyleParabel: + ls="StyleParabel"; + break; + case StylePolyLine: + ls="StylePolyLine"; + break; + default: + ls="StylePolyParabel"; + break; + } + + QString s="<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE vymmap>\n"; + QString colhint=""; + if (linkcolorhint==HeadingColor) + colhint=attribut("linkColorHint","HeadingColor"); + + QString mapAttr=attribut("version",__VYM_VERSION__); + if (savemode==CompleteMap) + mapAttr+= attribut("author",mapCenter->getAuthor()) + + attribut("comment",mapCenter->getComment()) + + attribut("date",mapCenter->getDate()) + + attribut("backgroundColor", mapCanvas->backgroundColor().name() ) + + attribut("linkStyle", ls ) + + attribut("linkColor", deflinkcolor.name() ) + + colhint; + s+=beginElement("vymmap",mapAttr); + incIndent(); + + // Find the used flags while traversing the tree + standardFlagsDefault->resetUsedCounter(); + + // Build xml recursivly + if (savemode==CompleteMap) + s+=mapCenter->saveToDir(tmpdir,prefix,writeflags,offset); + else + { + if ( undoSelection && + typeid(*undoSelection) == typeid(BranchObj) ) + s+=((BranchObj*)(undoSelection))->saveToDir(tmpdir,prefix,offset); + } + + // Save local settings + s+=settings.getXMLData (destPath); + + // Save selection + if (selection) + s+=valueElement("select",selection->getSelectString()); + + decIndent(); + s+=endElement("vymmap"); + + if (writeflags) + standardFlagsDefault->saveToDir (tmpdir+"/flags/","",writeflags); + + return s; +} + +void MapEditor::saveState() +{ + saveState (CompleteMap,NULL); +} + +void MapEditor::saveState(const SaveMode &mode, LinkableMapObj *part) +{ + // all binary data is saved in bakMapDir (created in Constructor) + // the xml data itself is kept in memory in backupXML + // + // For faster write/read of data, a part of the map can be + // written. Then the undoSelection will mark, which part of the + // map should be replaced if an undo is wanted later. + + if (mode==PartOfMap && part && (typeid(*part) == typeid (BranchObj) ) ) + { + // Writing a vympart only is useful for BranchObj + undoSelection=part; + backupXML=saveToDir (bakMapDir,mapName+"-",false, QPoint (),PartOfMap); + } else + { + undoSelection=NULL; + backupXML=saveToDir (bakMapDir,mapName+"-",false, QPoint (),CompleteMap); + } +} + +void MapEditor::finishedLineEditNoSave() +{ + // This is called by finishedLineEdit or any MapEditor method, + // which wants to assure, that lineedits finish, before e.g. a branch is + // deleted + + // After calling LineEdit and using the clipboard, the + // focus is not any longer on the main widget, we + // have to restore it using parentWidget()->setFocus() + + if (editingBO!=NULL) + { + editingBO->setHeading(lineedit->text() ); + editingBO=NULL; + lineedit->releaseKeyboard(); + lineedit->hide(); + parentWidget()->setFocus(); + mapCenter->reposition(); + adjustCanvasSize(); + ensureSelectionVisible(); + } +} + + +bool MapEditor::isDefault() +{ + return mapDefault; +} + +bool MapEditor::isUnsaved() +{ + return mapUnsaved; +} + +bool MapEditor::hasChanged() +{ + return mapChanged; +} + +void MapEditor::setChanged() +{ + mapChanged=true; + mapDefault=false; + mapUnsaved=true; + actionEditUndo->setEnabled (true); + actionFileSave->setEnabled (true); + findReset(); +} + +void MapEditor::closeMap() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + // Unselect before disabling the toolbar actions + if (selection) selection->unselect(); + selection=NULL; + updateActions(); + + clear(); + close(); +} + +void MapEditor::setFilePath(QString fname) +{ + setFilePath (fname,fname); +} + +void MapEditor::setFilePath(QString fname, QString destname) +{ + filePath=fname; + fileName=fname; + destPath=destname; + + // If fname is not an absolute path, complete it + filePath=QDir(fname).absPath(); + fileDir=filePath.left (1+filePath.findRev ("/")); + + // Set short name, too. Search from behind: + int i=fileName.findRev("/"); + if (i>=0) fileName=fileName.remove (0,i+1); + + // Forget the .vym (or .xml) for name of map + mapName=fileName.left(fileName.findRev(".",-1,true) ); +} + +QString MapEditor::getFilePath() +{ + return filePath; +} + +QString MapEditor::getFileName() +{ + return fileName; +} + +QString MapEditor::getMapName() +{ + return mapName; +} + +QString MapEditor::getDestPath() +{ + return destPath; +} + +int MapEditor::load (QString &fname, const LoadMode &lmode) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + int returnCode=0; + + if (lmode==NewMap) + { + if (selection) selection->unselect(); + selection=NULL; + mapCenter->clear(); + mapCenter->setMapEditor(this); + // (map state is set later at end of load...) + } else + { + setChanged(); + saveState(PartOfMap,selection); + } + + + mapBuilderHandler handler; + QFile file( fname ); + + // I am paranoid: file should exist anyway + // according to check in mainwindow. + if (!file.exists() ) + { + QMessageBox::critical( 0, tr( "Critical Parse Error" ), + tr("Couldn't open map " +fname)+"."); + returnCode=1; + } else + { + blockreposition=true; + QXmlInputSource source( file); + QXmlSimpleReader reader; + reader.setContentHandler( &handler ); + reader.setErrorHandler( &handler ); + handler.setMapEditor( this ); + handler.setTmpDir (filePath.left(filePath.findRev("/",-1))); // needed to load files with rel. path + handler.setLoadMode (lmode); + bool ok = reader.parse( source ); + blockreposition=false; + file.close(); + if ( ok ) + { + mapCenter->reposition(); + adjustCanvasSize(); + if (lmode==NewMap) + { + mapDefault=false; + mapChanged=false; + mapUnsaved=false; + } + } else + { + QMessageBox::critical( 0, tr( "Critical Parse Error" ), + tr( handler.errorProtocol() ) ); + // returnCode=1; + // Still return "success": the map maybe at least + // partially read by the parser + } + } + updateActions(); + return returnCode; +} + +int MapEditor::save (const SaveMode &savemode) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + int returnCode=0; + + // Create mapName and fileDir + makeSubDirs (fileDir); + QString fname; + if (saveZipped()) + // save as .xml + fname=mapName+".xml"; + else + // use name given by user, even if he chooses .doc + fname=fileName; + + + // Check if fname is writeable + QFile file( fileDir+fname); + if (!file.open( IO_WriteOnly ) ) + { + QMessageBox::critical( 0, tr( "Critical Save Error" ), + tr("Couldn't write to ") +fileDir+fname); + return 1; + } + file.close(); + + QString saveFile; + saveFile=saveToDir (fileDir,mapName+"-",true,QPoint(),savemode); + + file.setName ( fileDir + fname); + if ( !file.open( IO_WriteOnly ) ) + { + // This should neverever happen + QMessageBox::critical(0, tr("Critcal save error"),"MapEditor::save() Couldn't open "+file.name()); + return 1; + } + + // Write it finally, and write in UTF8, no matter what + QTextStream ts( &file ); + ts.setEncoding (QTextStream::UnicodeUTF8); + ts << saveFile; + file.close(); + + if (returnCode==0) + { + mapChanged=false; + mapUnsaved=false; + actionFileSave->setEnabled(false); + } + + return returnCode; +} + +void MapEditor::setZipped (bool z) +{ + zipped=z; +} + +bool MapEditor::saveZipped () +{ + return zipped; +} + +void MapEditor::print() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if ( !printer ) + { + printer = new QPrinter; + printer->setColorMode (QPrinter::Color); + } + + QRect totalBBox=mapCenter->getTotalBBox(); + + // Try to set orientation automagically + // Note: Interpretation of generated postscript is amibiguous, if + // there are problems with landscape mode, see + // http://sdb.suse.de/de/sdb/html/jsmeix_print-cups-landscape-81.html + + if (totalBBox.width()>totalBBox.height()) + // recommend landscape + printer->setOrientation (QPrinter::Landscape); + else + // recommend portrait + printer->setOrientation (QPrinter::Portrait); + + if ( printer->setup(this) ) + // returns false, if printing is canceled + { + QPainter pp(printer); + + // Don't print the visualisation of selection + LinkableMapObj *oldselection=NULL; + if (selection) + { + oldselection=selection; + selection->unselect(); + } + + // Handle sizes of map and paper: + // + // setWindow defines which part of the canvas will be transformed + // setViewport defines area on paper in device coordinates (dpi) + // e.g. (0,50,700,700) is upper part on A4 + // see also /usr/lib/qt3/doc/html/coordsys.html + + QPaintDeviceMetrics metrics (printer); + + double paperAspect = (double)metrics.width() / (double)metrics.height(); + double mapAspect = (double)totalBBox.width() / (double)totalBBox.height(); + + QRect mapRect=mapCenter->getTotalBBox(); + QCanvasRectangle *frame=NULL; + QCanvasText *footerFN=NULL; + QCanvasText *footerDate=NULL; + if (printFrame || printFooter) + { + + if (printFrame) + { + // Print frame around map + mapRect.setRect (mapRect.x()-10, mapRect.y()-10, + mapRect.width()+20, mapRect.height()+20); + frame=new QCanvasRectangle (mapRect,mapCanvas); + frame->setBrush (QColor(white)); + frame->setPen (QColor(black)); + frame->setZ(0); + frame->show(); + } + if (printFooter) + { + // Print footer below map + QFont font; + font.setPointSize(10); + footerFN=new QCanvasText (mapCanvas); + footerFN->setText ("VYM - " + fileName); + footerFN->setFont(font); + footerFN->move (mapRect.x(), mapRect.y() + mapRect.height() ); + footerFN->setZ(Z_TEXT); + footerFN->show(); + footerDate=new QCanvasText (mapCanvas); + footerDate->setText (QDate::currentDate().toString(Qt::TextDate)); + footerDate->setFont(font); + footerDate->move (mapRect.x()+mapRect.width()-footerDate->boundingRect().width(), mapRect.y() + mapRect.height() ); + footerDate->setZ(Z_TEXT); + footerDate->show(); + mapRect.setRect (mapRect.x(), mapRect.y(), + mapRect.width(), mapRect.height()+20); + } + pp.setWindow (mapRect.x(), mapRect.y(), mapRect.width(), mapRect.height()); + } else + { + pp.setWindow (mapRect); + } + + if (mapAspect>=paperAspect) + { + // Fit horizontally to paper width + pp.setViewport(0,0, metrics.width(),(int)(metrics.width()/mapAspect) ); + } else + { + // Fit vertically to paper height + pp.setViewport(0,0,(int)(metrics.height()*mapAspect),metrics.height()); + } + + mapCanvas->drawArea(mapRect, &pp); // draw Canvas to printer + + // Delete Frame and footer + if (footerFN) + { + delete (footerFN); + delete (footerDate); + } + if (frame) delete (frame); + + // Restore selection + if (oldselection) + { + selection=oldselection; + selection->select(); + } + } +} + +QPixmap MapEditor::getPixmap() +{ + QRect mapRect=mapCenter->getTotalBBox(); + QPixmap pix (mapRect.size()); + QPainter pp (&pix); + + // Don't print the visualisation of selection + LinkableMapObj *oldselection=NULL; + if (selection) + { + oldselection=selection; + selection->unselect(); + } + + pp.setWindow (mapRect); + + mapCanvas->drawArea(mapRect, &pp); // draw Canvas to painter + + + // Restore selection + if (oldselection) + { + selection=oldselection; + selection->select(); + } + + return pix; +} + +void MapEditor::exportImage(QString fn) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + QPixmap pix (getPixmap()); + pix.save(fn, "PNG"); +} + +void MapEditor::exportImage(QString fn, int item) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + QPixmap pix (getPixmap()); + pix.save(fn, exportImageFormatMenu->text(item) ); +} + +void MapEditor::exportASCII() +{ + // FIXME still experimental + QFileDialog *fd=new QFileDialog( this, tr("VYM - Export (ASCII)")); + fd->addFilter ("TXT (*.txt)"); + fd->setCaption("VYM - Export (ASCII) (still experimental)"); + fd->setMode( QFileDialog::AnyFile ); + fd->show(); + + if ( fd->exec() == QDialog::Accepted ) + { + if (QFile (fd->selectedFile()).exists() ) + { + QMessageBox mb( "VYM", + tr("The file ") + fd->selectedFile() + + tr(" exists already. Do you want to overwrite it?"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + Export ex; + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save + if (!ex.setOutputDir ("out")) + { + QMessageBox::critical (0,tr("Critical Export Error "),tr("Couldn't create directory ") + "out"); + return; + } + break;; + case QMessageBox::Cancel: + // do nothing + return; + break; + } + } + Export ex; + ex.setPath (fd->selectedFile() ); + ex.setMapCenter(mapCenter); + ex.exportMap(); + } +} + + +void MapEditor::exportXML(const QString &dir) +{ + // Create subdirectories + makeSubDirs (dir); + + // write to directory + QString saveFile=saveToDir (dir,mapName+"-",true,mapCenter->getTotalBBox().topLeft() ,CompleteMap); + QFile file; + + file.setName ( dir + "/"+mapName+".xml"); + if ( !file.open( IO_WriteOnly ) ) + { + // This should neverever happen + QMessageBox::critical (0,tr("Critical Export Error"),tr("MapEditor::exportXML couldn't open ")+file.name()); + return; + } + + // Write it finally, and write in UTF8, no matter what + QTextStream ts( &file ); + ts.setEncoding (QTextStream::UnicodeUTF8); + ts << saveFile; + file.close(); + + // Now write image, too + exportImage (dir+"/images/"+mapName+".png"); +} + +void MapEditor::clear() +{ + if (selection) + { + selection->unselect(); + selection=NULL; + } + + mapCenter->clear(); +} + +void MapEditor::undo() +{ + QDir d; + d.setPath(bakMapDir); + if (d.exists() ) + { + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection) + { + selection->unselect(); + selection=NULL; + } + + mapBuilderHandler handler; + QXmlInputSource source; + source.setData(backupXML); + QXmlSimpleReader reader; + reader.setContentHandler( &handler ); + reader.setErrorHandler( &handler ); + handler.setMapEditor( this ); + handler.setTmpDir ( bakMapDir ); // needed to load files with rel. path + if (undoSelection) + { + selection=undoSelection; + selection->select(); + handler.setLoadMode (ImportReplace); + + } else + { + mapCenter->clear(); + handler.setLoadMode (NewMap); + } + blockreposition=true; + bool ok = reader.parse( source ); + blockreposition=false; + if ( ok ) + mapCenter->reposition(); + + else + { + // This should never ever happen + QMessageBox::critical( 0, tr( "Critical Parse Error by reading backupFile" ), + tr( handler.errorProtocol() )+" in "+backupXML ); + } + // Undo not longer available now + actionEditUndo->setEnabled (false); + undoSelection=false; + mapChanged=false; + return; + } else + { + QMessageBox::critical( 0, tr( "Critical Error" ), + "Temporary directory " +bakMapDir + + tr (" used for undo is gone. \n" + "I will create a new one, but at the moment no undo is available.\n" + "Maybe you want to reload your original data.\n\n" + "Sorry for any inconveniences.") ); + makeTmpDirs(); + } +} + +void MapEditor::copy() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection) + { + if (typeid(*selection) == typeid(BranchObj) ) + { + BranchObj* to; + BranchObj* from; + clipboardME->clear(); + clipboardME->getMapCenter()->addBranch(); + to=clipboardME->getMapCenter()->getLastBranch(); + if (to) + { + from=(BranchObj*)(selection); + to->copy(from); + + // keep position relative to parent + to->move2RelPos ( from->getRelPos()); + + // select data in clipboard + clipboardME->select ("bo:0"); + + // repositioning makes testing nicer, + // but is not needed usually: + if (clipboardME->isVisible()) + { + clipboardME->getMapCenter()->reposition(); + } + else + clipboardME->hide(); + } + } + if (typeid(*selection) == typeid(FloatImageObj) ) + { + FloatImageObj* to; + FloatImageObj* from; + clipboardME->clear(); + clipboardME->getMapCenter()->addFloatImage(); + to=clipboardME->getMapCenter()->getLastFloatImage(); + if (to) + { + from=(FloatImageObj*)(selection); + to->copy(from); + + // select data in clipboard + clipboardME->select ("fi:0"); + + // repositioning makes testing nicer, + // but is not needed usually: + if (clipboardME->isVisible()) + { + clipboardME->getMapCenter()->reposition(); + } + else + clipboardME->hide(); + } + } + } +} + +LinkableMapObj* MapEditor::pasteNoSave() +{ + return pasteAtNoSave (-1); +} + +LinkableMapObj* MapEditor::pasteAtNoSave(int pos) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + LinkableMapObj *fromLMO=clipboardME->getSelection(); + LinkableMapObj *returnLMO=NULL; + + if (selection && fromLMO) + { + + if (typeid(*fromLMO) == typeid(BranchObj) ) + { + if (typeid(*selection) == typeid(MapCenterObj)) + { + returnLMO=mapCenter->addBranch( (BranchObj*)(fromLMO) ); + ((BranchObj*)(returnLMO))->move2RelPos(normalise(fromLMO->getRelPos() ) ); + } + if (typeid(*selection) == typeid(BranchObj)) + if (pos<0) + returnLMO=((BranchObj*)(selection))->addBranch((BranchObj*)(fromLMO) ); + else + { + BranchObj *par=(BranchObj*)(selection->getParObj()); + if (par) returnLMO=par->insertBranch((BranchObj*)(fromLMO),pos ); + } + } + + if (typeid(*fromLMO) == typeid(FloatImageObj) && + (typeid(*selection) == typeid (BranchObj) || + typeid(*selection)==typeid(MapCenterObj)) ) + returnLMO=((BranchObj*) (selection))->addFloatImage ((FloatImageObj*)(fromLMO)); + + } + return returnLMO; +} + +void MapEditor::cutNoSave() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj* bo; + BranchObj* par; + if (selection != NULL) { + if (typeid(*selection) == typeid(BranchObj) ) + { + bo=(BranchObj*)(selection); + par=(BranchObj*)(bo->getParObj()); + bo->unselect(); + selection=NULL; + par->removeBranch(bo); + selection=par; + selection->select(); + } + if (typeid(*selection) == typeid(FloatImageObj) ) + { + FloatImageObj* fio=(FloatImageObj*)(selection); + par=(BranchObj*)(fio->getParObj()); + fio->unselect(); + selection=NULL; + par->removeFloatImage(fio); + selection=par; + selection->select(); + } + } +} + +void MapEditor::paste() +{ + setChanged(); + saveState(PartOfMap,selection); + pasteNoSave(); + mapCenter->reposition(); + adjustCanvasSize(); +} + +void MapEditor::cut() +{ + setChanged(); + saveState(PartOfMap,selection->getParObj()); + copy(); + cutNoSave(); + mapCenter->reposition(); + adjustCanvasSize(); +} + +void MapEditor::moveBranchUp() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj* bo; + BranchObj* par; + if (typeid(*selection) == typeid(BranchObj) ) + { + setChanged(); + saveState(PartOfMap,selection->getParObj()); + bo=(BranchObj*)(selection); + par=(BranchObj*)(bo->getParObj()); + selection->unselect(); + selection=par->moveBranchUp (bo); + selection->select(); + mapCenter->reposition(); + ensureSelectionVisible(); + } +} + +void MapEditor::moveBranchDown() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj* bo; + BranchObj* par; + if (typeid(*selection) == typeid(BranchObj) ) + { + setChanged(); + saveState(PartOfMap,selection->getParObj()); + bo=(BranchObj*)(selection); + par=(BranchObj*)(bo->getParObj()); + selection->unselect(); + selection=par->moveBranchDown(bo); + selection->select(); + mapCenter->reposition(); + ensureSelectionVisible(); + } +} + +void MapEditor::editHeading() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection && + (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj) ) ) + { + setChanged(); + saveState(PartOfMap,selection); + + ensureSelectionVisible(); + BranchObj *bo=(BranchObj*)(selection); + editingBO=(BranchObj*)(selection); + QPoint p = worldMatrix().map(QPoint (bo->x(),bo->y())); + lineedit->setGeometry(p.x()-contentsX(),p.y()-contentsY(),200,25); + QString s=bo->getHeading(); + lineedit->setText(s); + lineedit->setCursorPosition(1); + if (actionSettingsAutoselectText->isOn() && !s.isEmpty() && actionSettingsPasteNewHeading->isOn() ) + lineedit->selectAll(); + lineedit->show(); + + lineedit->grabKeyboard(); + lineedit->setFocus(); + } +} + + +void MapEditor::addNewBranch(int pos) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection && + (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj) ) ) + { + setChanged(); + saveState(PartOfMap,selection); + + BranchObj* bo1 = (BranchObj*) (selection); + bool wasScrolled=false; + BranchObj *newbo=NULL; + if (pos==0) + { + // save scroll state. If scrolled, automatically select + // new branch in order to tmp unscroll parent... + wasScrolled=bo1->isScrolled(); + newbo=bo1->addBranch(); + } else + { + BranchObj *parbo=(BranchObj*)(selection->getParObj()); + if (parbo) + { + if (pos<0) + // add above selection + newbo=parbo->insertBranch(bo1->getNum()); + else + // add below selection + newbo=parbo->insertBranch(bo1->getNum()+1); + } else + // This should not happen... + return; + + } + + LinkableMapObj *oldselection=selection; + + mapCenter->reposition(); + adjustCanvasSize(); + if (actionSettingsAutoedit->isOn() || + actionSettingsAutoselectHeading->isOn() ) + { + selection->unselect(); + selection=newbo; + selection->select(); + if (actionSettingsPasteNewHeading->isOn() ) + { + BranchObj *bo2= (BranchObj*)(selection); + bo2->setHeading(""); + } + if (actionSettingsAutoedit->isOn() ) + editHeading(); + if (!actionSettingsAutoselectHeading->isOn() + && !wasScrolled) + { + selection->unselect(); + selection=oldselection; + selection->select(); + } + } + } +} + +void MapEditor::deleteSelection() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection && typeid(*selection) ==typeid(BranchObj) ) + { + setChanged(); + saveState(PartOfMap,selection->getParObj()); + BranchObj* bo=dynamic_cast <BranchObj*> (selection); + BranchObj* par=(BranchObj*)(bo->getParObj()); + bo->unselect(); + selection=NULL; + par->removeBranch(bo); + selection=par; + selection->select(); + ensureSelectionVisible(); + mapCenter->reposition(); + adjustCanvasSize(); + } + if (selection && typeid(*selection) ==typeid(FloatImageObj) ) + { + setChanged(); + saveState(PartOfMap,selection->getParObj()); + FloatImageObj* fio=dynamic_cast <FloatImageObj*> (selection); + BranchObj* par=(BranchObj*)(fio->getParObj()); + fio->unselect(); + selection=NULL; + par->removeFloatImage(fio); + selection=par; + selection->select(); + ensureSelectionVisible(); + mapCenter->reposition(); + adjustCanvasSize(); + } +} + +LinkableMapObj* MapEditor::getSelection() +{ + return selection; +} + +bool MapEditor::select (QString s) +{ + LinkableMapObj *lmo=mapCenter; + QString part; + QString typ; + QString num; + while (!s.isEmpty() ) + { + part=s.section(",",0,0); + typ=part.left (3); + num=part.right(part.length() - 3); + + if (typ=="mc:") + { + if (num=="") + break; + else + lmo=mapCenter->getBranchNum (num.toUInt()); + } else + if (typ=="bo:") + lmo=((BranchObj*)(lmo))->getBranchNum (num.toUInt()); + else + if (typ=="fi:") + lmo=((BranchObj*)(lmo))->getFloatImageNum (num.toUInt()); + + + + if (!lmo) break; + + if (s.contains(",")) + s=s.right(s.length() - part.length() -1 ); + else + break; + } + + // Finally select the found object + if (lmo) + { + if (selection) selection->unselect(); + selection=lmo; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + return true; + } else + return false; + + +} + +void MapEditor::unselect() +{ + if (selection) + { + selectionLast=selection; + selection->unselect(); + selection=NULL; + } +} + +void MapEditor::reselect() +{ + if (selectionLast) + { + selection=selectionLast; + selection->select(); + selectionLast=NULL; + } +} + +void MapEditor::selectNextBranch() +{ + // Increase number of branch + if (selection) + { + QString s=selection->getSelectString(); + QString part; + QString typ; + QString num; + + // Where am I? + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + s=s.left (s.length() -num.length()); + + // Go to next lmo + num=QString ("%1").arg(num.toUInt()+1); + + s=s+num; + + // Try to select this one + if (select (s)) return; + + // We have no direct successor, + // try to increase the parental number in order to + // find a successor with same depth + + int d=selection->getDepth(); + int oldDepth=d; + int i; + bool found=false; + bool b; + while (!found && d>0) + { + s=s.section (",",0,d-1); + // replace substring of current depth in s with "1" + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + if (d>1) + { + // increase number of parent + num=QString ("%1").arg(num.toUInt()+1); + s=s.section (",",0,d-2) + ","+ typ+num; + } else + { + // Special case, look at orientation + if (selection->getOrientation()==OrientRightOfCenter) + num=QString ("%1").arg(num.toUInt()+1); + else + num=QString ("%1").arg(num.toUInt()-1); + s=typ+num; + } + + if (select (s)) + // pad to oldDepth, select the first branch for each depth + for (i=d;i<oldDepth;i++) + { + b=select (s); + if (b) + { + if ( ((BranchObj*)(selection))->countBranches()>0) + s+=",bo:0"; + else + break; + } else + break; + } + + // try to select the freshly built string + found=select(s); + d--; + } + return; + } +} + +void MapEditor::selectPrevBranch() +{ + // Decrease number of branch + if (selection) + { + QString s=selection->getSelectString(); + QString part; + QString typ; + QString num; + + // Where am I? + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + s=s.left (s.length() -num.length()); + + // Go to next lmo + num=QString ("%1").arg(num.toUInt()-1); + + s=s+num; + + // Try to select this one + if (select (s)) return; + + // We have no direct precessor, + // try to decrease the parental number in order to + // find a precessor with same depth + + int d=selection->getDepth(); + int oldDepth=d; + int i; + bool found=false; + bool b; + while (!found && d>0) + { + s=s.section (",",0,d-1); + // replace substring of current depth in s with "1" + part=s.section(",",-1); + typ=part.left (3); + num=part.right(part.length() - 3); + + if (d>1) + { + // decrease number of parent + num=QString ("%1").arg(num.toUInt()-1); + s=s.section (",",0,d-2) + ","+ typ+num; + } else + { + // Special case, look at orientation + if (selection->getOrientation()==OrientRightOfCenter) + num=QString ("%1").arg(num.toUInt()-1); + else + num=QString ("%1").arg(num.toUInt()+1); + s=typ+num; + } + + if (select(s)) + // pad to oldDepth, select the last branch for each depth + for (i=d;i<oldDepth;i++) + { + b=select (s); + if (b) + if ( ((BranchObj*)(selection))->countBranches()>0) + s+=",bo:"+ QString ("%1").arg( ((BranchObj*)(selection))->countBranches()-1 ); + else + break; + else + break; + } + + // try to select the freshly built string + found=select(s); + d--; + } + return; + } +} + +void MapEditor::selectUpperBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection) + { + if (typeid(*selection) == typeid(BranchObj)) + { + if (selection->getOrientation()==OrientRightOfCenter) + selectPrevBranch(); + else + if (selection->getDepth()==1) + selectNextBranch(); + else + selectPrevBranch(); + } + } +} + +void MapEditor::selectLowerBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (selection) + { + if (typeid(*selection) == typeid(BranchObj)) + { + if (selection->getOrientation()==OrientRightOfCenter) + selectNextBranch(); + else + if (selection->getDepth()==1) + selectPrevBranch(); + else + selectNextBranch(); + } + } +} + + +void MapEditor::selectLeftBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj* bo; + BranchObj* par; + if (selection) + { + if (typeid(*selection) == typeid(MapCenterObj)) + { + par= (BranchObj*) (selection); + bo=par->getLastSelectedBranch(); + if (bo) + { + // Workaround for reselecting on left and right side + if (bo->getOrientation()==OrientRightOfCenter) + { + bo=par->getLastBranch(); + } + if (bo) + { + par->unselect(); + selection=bo; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + } + } else + { + par=(BranchObj*)(selection->getParObj()); + if (selection->getOrientation()==OrientRightOfCenter) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(FloatImageObj)) + { + selection->unselect(); + selection=par; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + } else + { + if (typeid(*selection) == typeid(BranchObj) ) + { + bo=((BranchObj*)(selection))->getLastSelectedBranch(); + if (bo) + { + selection->unselect(); + selection=bo; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + } + } + } + } +} + +void MapEditor::selectRightBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj* bo; + BranchObj* par; + + if (selection) + { + if (typeid(*selection) == typeid(MapCenterObj)) + { + par= (BranchObj*) (selection); + bo=par->getLastSelectedBranch(); + if (bo) + { + // Workaround for relecting on left and right side + if (bo->getOrientation()==OrientLeftOfCenter) + bo=par->getFirstBranch(); + if (bo) + { + par->unselect(); + selection=bo; + selection->select(); + ensureSelectionVisible(); + } + } + } else + { + par=(BranchObj*)(selection->getParObj()); + if (selection->getOrientation()==OrientLeftOfCenter) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(FloatImageObj)) + { + selection->unselect(); + selection=par; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + } else + { + if (typeid(*selection) == typeid(BranchObj) ) + { + bo=((BranchObj*)(selection))->getLastSelectedBranch(); + if (bo) + { + selection->unselect(); + selection=bo; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + } + } + } + } +} + +void MapEditor::selectFirstBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj *bo1; + BranchObj *bo2; + BranchObj* par; + if (selection) { + if (typeid(*selection) == typeid(BranchObj)) + { + bo1= (BranchObj*) (selection); + par=(BranchObj*)(bo1->getParObj()); + bo2=par->getFirstBranch(); + if (bo2) { + bo1->unselect(); + selection=bo2; + selection->select(); + ensureSelectionVisible(); + } + } + adjustCanvasSize(); + } +} + +void MapEditor::selectLastBranch() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + BranchObj *bo1; + BranchObj *bo2; + BranchObj* par; + if (selection) { + if (typeid(*selection) == typeid(BranchObj)) + { + bo1= (BranchObj*) (selection); + par=(BranchObj*)(bo1->getParObj()); + bo2=par->getLastBranch(); + if (bo2) { + bo1->unselect(); + selection=bo2; + selection->select(); + ensureSelectionVisible(); + } + } + adjustCanvasSize(); + } +} + +void MapEditor::setColor(QColor c) +{ + actColor=c; +} + +void MapEditor::selectBackgroundColor() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + QColor col = QColorDialog::getColor( mapCanvas->backgroundColor(), this ); + if ( !col.isValid() ) return; + setBackgroundColor( col ); + setChanged(); +} + +void MapEditor::setBackgroundColor(QColor c) +{ + mapCanvas->setBackgroundColor (c); +} + +QColor MapEditor::pickColor() +{ + if (selection) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) + { + BranchObj *bo=(BranchObj*)(selection); + actColor=bo->getColor(); + } + } + return actColor; +} + +void MapEditor::colorItem() +{ + if (selection) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) + { + setChanged(); + saveState(PartOfMap,selection); + BranchObj *bo=(BranchObj*)(selection); + bo->setColor(actColor, false); // color links, color childs + } + } +} + +void MapEditor::colorBranch() +{ + if (selection) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) + { + setChanged(); + saveState(PartOfMap,selection); + BranchObj *bo=(BranchObj*)(selection); + bo->setColor(actColor, true); // color links, color childs + } + } +} + + +void MapEditor::toggleStandardFlag(QString f) +{ + if (selection) + { + setChanged(); + saveState(PartOfMap,selection); + ((BranchObj*)(selection))->toggleStandardFlag (f); + } +} + +void MapEditor::setViewCenter() +{ + // transform to CanvasView Coord: + QPoint p=worldMatrix().map(movingCenter); + center ( p.x(), p.y()); +} + + +BranchObj* MapEditor::findText (QString s, bool cs) +{ + if (!itFind) + { // Nothing found or new find process + if (EOFind) + // nothing found, start again + EOFind=false; + itFind=mapCenter->first(); + } + bool searching=true; + bool foundNote=false; + while (searching && !EOFind) + { + if (itFind) + { + // Searching in Note + if (itFind->getNote().contains(s,cs)) + { + if (selection!=itFind) + { + if (selection) ((BranchObj*)(selection))->unselect(); + selection=itFind; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + } + if (textEditor->findText(s,cs)) + { + searching=false; + foundNote=true; + } + } + // Searching in Heading + if (searching && itFind->getHeading().contains (s,cs) ) + { + if (selection) ((BranchObj*)(selection))->unselect(); + selection=itFind; + selection->select(); + adjustCanvasSize(); + ensureSelectionVisible(); + searching=false; + } + } + if (!foundNote) + { + itFind=itFind->next(); + if (!itFind) EOFind=true; + } + } + if (!searching) + { + adjustCanvasSize(); + return (BranchObj*)(selection); + } else + return NULL; +} + +void MapEditor::findReset() +{ // Necessary if text to find changes during a find process + itFind=NULL; + EOFind=false; +} + +void MapEditor::openURL() +{ + if (selection ) + { + if (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) + { + QString url=((BranchObj*)(selection))->getURL(); + + QProcess *proc = new QProcess( this ); + +#if !defined(Q_OS_MACX) + proc->addArgument( settings.readEntry("/vym/mainwindow/readerURL","konqueror" )); +#else + proc->addArgument( settings.readEntry("/vym/mainwindow/readerURL", + "/Applications/Safari.app/Contents/MacOS/Safari" )); +#endif + + proc->addArgument( url); + + if ( !proc->start() ) + // error handling + if (mainWindow->settingsURL() ) + openURL(); + } + } +} + +void MapEditor::editURL() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + bool ok; + QString text = QInputDialog::getText( + "VYM", tr("Enter URL:"), QLineEdit::Normal, + ((BranchObj*)(selection))->getURL(), &ok, this ); + if ( ok) + { + // user entered something and pressed OK + ((BranchObj*)(selection))->setURL (text); + updateActions(); + setChanged(); + } + } +} + +void MapEditor::editHeading2URL() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + BranchObj *b=(BranchObj*)(selection); + b->setURL (b->getHeading()); + updateActions(); + setChanged(); + } +} + +void MapEditor::editBugzilla2URL() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + BranchObj *b=(BranchObj*)(selection); + b->setURL ("http://bugzilla.suse.de/show_bug.cgi?id="+b->getHeading()); + updateActions(); + setChanged(); + } +} + +void MapEditor::editVymLink() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + QFileDialog *fd=new QFileDialog( this,tr("VYM - Link to another map")); + fd->addFilter (QString (tr("vym map") + " (*.vym)")); + fd->setCaption(tr("VYM - Link to another map")); + if (! ((BranchObj*)(selection))->getVymLink().isEmpty() ) + fd->setSelection( ((BranchObj*)(selection))->getVymLink() ); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + ((BranchObj*)(selection))->setVymLink (fd->selectedFile() ); + updateActions(); + mapCenter->reposition(); + adjustCanvasSize(); + canvas()->update(); + setChanged(); + } +} + +void MapEditor::deleteVymLink() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + ((BranchObj*)(selection))->setVymLink ("" ); + updateActions(); + mapCenter->reposition(); + adjustCanvasSize(); + canvas()->update(); + setChanged(); + } +} + +QString MapEditor::getVymLink() +{ + if (selection && (typeid(*selection) == typeid(BranchObj) || + typeid(*selection) == typeid(MapCenterObj)) ) + { + return ((BranchObj*)(selection))->getVymLink(); + } + return ""; + +} + +void MapEditor::editMapInfo() +{ + ExtraInfoDialog dia; + dia.setMapName (getFileName() ); + dia.setAuthor (mapCenter->getAuthor() ); + dia.setComment(mapCenter->getComment() ); + + // Calc some stats + QString stats; + int i=0; + QCanvasItemList l=canvas()->allItems(); + for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) + i++; + stats+=QString ("%1 items on canvas\n").arg (i,6); + + uint b=0; + uint f=0; + uint n=0; + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + if (!bo->getNote().isEmpty() ) n++; + f+= bo->countFloatImages(); + b++; + bo=bo->next(); + } + stats+=QString ("%1 branches\n").arg (b-1,6); + stats+=QString ("%1 notes\n").arg (n,6); + stats+=QString ("%1 images\n").arg (f,6); + dia.setStats (stats); + + // Finally show dialog + if (dia.exec() == QDialog::Accepted) + { + mapCenter->setAuthor (dia.getAuthor() ); + mapCenter->setComment (dia.getComment() ); + setChanged(); + } +} + +void MapEditor::updateActions() +{ + if (getLinkColorHint()==HeadingColor) + actionFormatLinkColorHint->setOn(true); + else + actionFormatLinkColorHint->setOn(false); + + switch (linkstyle) + { + case StyleLine: + actionFormatLinkStyleLine->setOn(true); + break; + case StyleParabel: + actionFormatLinkStyleParabel->setOn(true); + break; + case StylePolyLine: + actionFormatLinkStylePolyLine->setOn(true); + break; + case StylePolyParabel: + actionFormatLinkStylePolyParabel->setOn(true); + break; + default: + break; + } + + QPixmap pix( 16, 16 ); + pix.fill( mapCanvas->backgroundColor() ); + actionFormatBackColor->setIconSet( pix ); + pix.fill( deflinkcolor ); + actionFormatLinkColor->setIconSet( pix ); + + actionEditUndo->setEnabled( mapChanged ); + actionFileSave->setEnabled( mapUnsaved ); + + if (selection) + { + if ( (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) + { + standardFlagsDefault->setEnabled (true); + + if ( ((BranchObj*)(selection))->getURL().isEmpty() ) + actionEditOpenURL->setEnabled (false); + else + actionEditOpenURL->setEnabled (true); + actionEditURL->setEnabled (true); + actionEditHeading2URL->setEnabled (true); + actionEditBugzilla2URL->setEnabled (true); + + if ( ((BranchObj*)(selection))->getVymLink().isEmpty() ) + { + actionEditOpenVymLink->setEnabled (false); + actionEditDeleteVymLink->setEnabled (false); + } else + { + actionEditOpenVymLink->setEnabled (true); + actionEditDeleteVymLink->setEnabled (true); + } + actionEditVymLink->setEnabled (true); + + actionEditCopy->setEnabled (true); + actionEditCut->setEnabled (true); + actionEditPaste->setEnabled (true); + actionEditMoveUp->setEnabled (true); + actionEditMoveDown->setEnabled (true); + actionEditToggleScroll->setEnabled (true); + actionEditHeading->setEnabled (true); + actionEditDelete->setEnabled (true); + actionEditAddBranch->setEnabled (true); + actionEditAddBranchAbove->setEnabled (true); + actionEditAddBranchBelow->setEnabled (true); + actionEditImportAdd->setEnabled (true); + actionEditImportReplace->setEnabled (true); + actionEditSaveBranch->setEnabled (true); + actionEditSelectFirst->setEnabled (true); + actionEditSelectLast->setEnabled (true); + actionEditToggleFloatExport->setEnabled (false); + actionFormatPickColor->setEnabled (true); + actionFormatColorBranch->setEnabled (true); + actionFormatColorSubtree->setEnabled (true); + switch (selection->getFrameType()) + { + case NoFrame: + actionFormatFrameNone->setOn(true); + break; + case Rectangle: + actionFormatFrameRectangle->setOn(true); + break; + default: + break; + } + } + if ( (typeid(*selection) == typeid(FloatImageObj)) ) + { + standardFlagsDefault->setEnabled (false); + + actionEditOpenURL->setEnabled (false); + actionEditURL->setEnabled (false); + actionEditHeading2URL->setEnabled (false); + actionEditBugzilla2URL->setEnabled (false); + actionEditOpenVymLink->setEnabled (false); + actionEditVymLink->setEnabled (false); + actionEditDeleteVymLink->setEnabled (false); + + actionEditCopy->setEnabled (true); + actionEditCut->setEnabled (true); + actionEditPaste->setEnabled (false); //FIXME + actionEditMoveUp->setEnabled (false); + actionEditMoveDown->setEnabled (false); + actionEditToggleScroll->setEnabled (false); + actionEditHeading->setEnabled (false); + actionEditDelete->setEnabled (true); + actionEditAddBranch->setEnabled (false); + actionEditAddBranchAbove->setEnabled (false); + actionEditAddBranchBelow->setEnabled (false); + actionEditImportAdd->setEnabled (false); + actionEditSaveBranch->setEnabled (false); + actionEditImportReplace->setEnabled (false); + actionEditSelectFirst->setEnabled (false); + actionEditSelectLast->setEnabled (false); + actionEditToggleFloatExport->setOn + ( ((FloatImageObj*)(selection))->getFloatExport() ); + actionFormatPickColor->setEnabled (false); + actionFormatColorBranch->setEnabled (false); + actionFormatColorSubtree->setEnabled (false); + } + + } else + { + standardFlagsDefault->setEnabled (false); + + actionEditCopy->setEnabled (false); + actionEditCut->setEnabled (false); + actionEditPaste->setEnabled (false); + actionEditMoveUp->setEnabled (false); + actionEditMoveDown->setEnabled (false); + actionEditToggleScroll->setEnabled (false); + actionEditOpenURL->setEnabled (false); + actionEditURL->setEnabled (false); + actionEditOpenVymLink->setEnabled (false); + actionEditVymLink->setEnabled (false); + actionEditDeleteVymLink->setEnabled (false); + actionEditHeading2URL->setEnabled (false); + actionEditBugzilla2URL->setEnabled (false); + actionEditHeading->setEnabled (false); + actionEditDelete->setEnabled (false); + actionEditAddBranch->setEnabled (false); + actionEditAddBranchAbove->setEnabled (false); + actionEditAddBranchBelow->setEnabled (false); + actionEditSaveBranch->setEnabled (false); + actionEditImportReplace->setEnabled (false); + actionEditSelectFirst->setEnabled (false); + actionEditSelectLast->setEnabled (false); + actionEditToggleFloatExport->setEnabled (false); + actionFormatPickColor->setEnabled (false); + actionFormatColorBranch->setEnabled (false); + actionFormatColorSubtree->setEnabled (false); + } +} + +void MapEditor::setLinkStyle (LinkStyle ls) +{ + linkstyle=ls; + + BranchObj *bo; + bo=mapCenter->first(); + bo=bo->next(); + while (bo) + { + bo->setLinkStyle(bo->getDefLinkStyle()); + bo=bo->next(); + } + //setChanged(); + //saveState(); +} + +LinkStyle MapEditor::getLinkStyle () +{ + return linkstyle; +} + +void MapEditor::setLinkColor(QColor c) +{ + deflinkcolor=c; + updateActions(); +} + +void MapEditor::setLinkColorHint() +{ + // called from setLinkColorHint(lch) or at end of parse + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + bo->setLinkColor(); + bo=bo->next(); + } +} + +void MapEditor::setLinkColorHint(LinkColorHint lch) +{ + linkcolorhint=lch; + setLinkColorHint(); +} + +void MapEditor::toggleLinkColorHint() +{ + if (linkcolorhint==HeadingColor) + linkcolorhint=DefaultColor; + else + linkcolorhint=HeadingColor; + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + bo->setLinkColor(); + bo=bo->next(); + } +} + +LinkColorHint MapEditor::getLinkColorHint() +{ + return linkcolorhint; +} + +QColor MapEditor::getDefLinkColor() +{ + return deflinkcolor; +} + +void MapEditor::selectLinkColor() +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + QColor col = QColorDialog::getColor( deflinkcolor, this ); + if ( !col.isValid() ) return; + setLinkColor( col ); + setChanged(); +} + +void MapEditor::toggleScroll() +{ + if (selection && (typeid(*selection) == typeid(BranchObj)) ) + { + BranchObj *bo=((BranchObj*)(selection)); + if (bo->countBranches()==0) return; + if (bo->getDepth()==0) return; + setChanged(); + saveState(PartOfMap,selection); + bo->toggleScroll(); + adjustCanvasSize(); + canvas()->update(); + } +} + +void MapEditor::unScrollAll() +{ + BranchObj *bo; + bo=mapCenter->first(); + while (bo) + { + if (bo->isScrolled()) bo->toggleScroll(); + bo=bo->next(); + } +} + +void MapEditor::loadFloatImage () +{ + if (selection && + (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) + { + BranchObj *bo=((BranchObj*)(selection)); + + QFileDialog *fd=new QFileDialog( this,tr("vym - load image")); + fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)")); + ImagePreview *p =new ImagePreview (fd); + fd->setContentsPreviewEnabled( TRUE ); + fd->setContentsPreview( p, p ); + fd->setPreviewMode( QFileDialog::Contents ); + fd->setCaption(tr("vym - Load image")); + fd->setDir (lastImageDir); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + setChanged(); + saveState(PartOfMap,selection); + QString fn=fd->selectedFile(); + lastImageDir=fn.left(fn.findRev ("/")); + bo->addFloatImage(); + // FIXME check if load was successful + bo->getLastFloatImage()->load(fn); + bo->getLastFloatImage()->setOriginalFilename(fn); + mapCenter->reposition(); + adjustCanvasSize(); + canvas()->update(); + } + } +} + +void MapEditor::saveFloatImage (int item) +{ + if (selection && + (typeid(*selection) == typeid(FloatImageObj)) ) + { + FloatImageObj *fio=((FloatImageObj*)(selection)); + const char* fmt = saveImageFormatMenu->text(item); + + QFileDialog *fd=new QFileDialog( this, tr("vym - save image as") + fmt); + fd->addFilter ("PNG (*.png)"); + fd->addFilter ("BMP (*.bmp)"); + fd->addFilter ("XBM (*.xbm)"); + fd->addFilter ("JPG (*.jpg)"); + fd->addFilter ("XPM (*.xpm)"); + fd->addFilter ("GIF (*.gif)"); + fd->addFilter ("PNM (*.pnm)"); + fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)")); + fd->setCaption(tr("vym - Save image as ") + fmt); + fd->setMode( QFileDialog::AnyFile ); + fd->setSelection (fio->getOriginalFilename()); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + if (QFile (fd->selectedFile()).exists() ) + { + QMessageBox mb( "VYM", + tr("The file ") + fd->selectedFile() + + tr(" exists already. " + "Do you want to overwrite it?"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::QMessageBox::NoButton ); + + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + switch( mb.exec() ) + { + case QMessageBox::Yes: + // save + break;; + case QMessageBox::Cancel: + // do nothing + return; + break; + } + } + fio->save (fd->selectedFile(),fmt); + } + } +} + +void MapEditor::toggleFloatExport() +{ + if (selection && + (typeid(*selection) == typeid(FloatImageObj))|| + (typeid(*selection) == typeid(FloatObj)) ) + { + FloatImageObj *fio=((FloatImageObj*)(selection)); + fio->setFloatExport (actionEditToggleFloatExport->isOn() ); + } +} + +void MapEditor::setFrame(const FrameType &t) +{ + if (selection && + (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) + { + selection->setFrameType (t); + mapCenter->reposition(); + selection->updateLink(); + } +} + +void MapEditor::importDir(BranchObj *dst, QDir d) +{ + if (selection && + (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) + { + BranchObj *bo; + + // Traverse directories + d.setFilter( QDir::Dirs| QDir::Hidden | QDir::NoSymLinks ); + const QFileInfoList *dirlist = d.entryInfoList(); + QFileInfoListIterator itdir( *dirlist ); + QFileInfo *fi; + + while ( (fi = itdir.current()) != 0 ) + { + if (fi->fileName() != "." && fi->fileName() != ".." ) + { + dst->addBranch(); + bo=dst->getLastBranch(); + bo->setHeading (fi->fileName() ); + bo->setColor (QColor("blue"),false); + bo->toggleScroll(); + if ( !d.cd(fi->fileName()) ) + QMessageBox::critical (0,tr("Critical Import Error"),tr("Cannot find the directory")); + else + { + importDir (bo,d); + d.cdUp(); + } + } + ++itdir; + } + // Traverse files + d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks ); + const QFileInfoList *filelist = d.entryInfoList(); + QFileInfoListIterator itfile( *filelist ); + + while ( (fi = itfile.current()) != 0 ) + { + dst->addBranch(); + bo=dst->getLastBranch(); + bo->setHeading (fi->fileName() ); + bo->setColor (QColor("black"),false); + ++itfile; + } + } +} + +void MapEditor::importDir() +{ + if (selection && + (typeid(*selection) == typeid(BranchObj)) || + (typeid(*selection) == typeid(MapCenterObj)) ) + { + QFileDialog *fd=new QFileDialog( this,tr("VYM - Choose directory structur to import")); + fd->setMode (QFileDialog::DirectoryOnly); + fd->addFilter (QString (tr("vym map") + " (*.vym)")); + fd->setCaption(tr("VYM - Choose directory structur to import")); + fd->show(); + + QString fn; + if ( fd->exec() == QDialog::Accepted ) + { + BranchObj *bo=((BranchObj*)(selection)); + importDir (bo,QDir(fd->selectedFile()) ); + mapCenter->reposition(); + adjustCanvasSize(); + canvas()->update(); + } + } +} + +void MapEditor::testFunction() +{ + cout << "MapEditor::testFunction() called\n"; +} + +void MapEditor::ensureSelectionVisible() +{ + LinkableMapObj* lmo= dynamic_cast <LinkableMapObj*> (selection); + QPoint p; + if (selection->getOrientation() == OrientLeftOfCenter) + p= worldMatrix().map(QPoint (lmo->x(),lmo->y())); + else + p= worldMatrix().map(QPoint (lmo->x()+lmo->width(),lmo->y()+lmo->height())); + ensureVisible (p.x(), p.y() ); + +} + +void MapEditor::updateViewCenter() +{ + // Update movingCenter, so that we can zoom comfortably later + QRect rc = QRect( contentsX(), contentsY(), + visibleWidth(), visibleHeight() ); + QRect canvasRect = inverseWorldMatrix().mapRect(rc); + movingCenter.setX((canvasRect.right() + canvasRect.left())/2); + movingCenter.setY((canvasRect.top() + canvasRect.bottom())/2); +} + +void MapEditor::contentsContextMenuEvent ( QContextMenuEvent * e ) +{ + // Lineedits are already closed by preceding + // mouseEvent, we don't need to close here. + + QPoint p = inverseWorldMatrix().map(e->pos()); + LinkableMapObj* lmo=mapCenter->findMapObj(p, NULL); + + if (lmo) + { // MapObj was found + if (selection != lmo) + { + // select the MapObj + if (selection) selection->unselect(); + selection=lmo; + selection->select(); + adjustCanvasSize(); + } + // Context Menu + if (selection) + { + if (typeid(*selection)==typeid(BranchObj) || + typeid(*selection)==typeid(MapCenterObj) ) + { + // Context Menu on branch or mapcenter + updateActions(); + branchContextMenu->popup(e->globalPos() ); + } + if (typeid(*selection)==typeid(FloatImageObj)) + { + // Context Menu on floatimage + updateActions(); + floatimageContextMenu->popup(e->globalPos() ); + } + } + } else + { // No MapObj found, we are on the Canvas itself + // Context Menu on Canvas + updateActions(); + canvasContextMenu->popup(e->globalPos() ); + } +} + +void MapEditor::contentsMousePressEvent(QMouseEvent* e) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + QPoint p = inverseWorldMatrix().map(e->pos()); + LinkableMapObj* lmo=mapCenter->findMapObj(p, NULL); + + // Special case: CTRL is pressed, don't select anything + if (e->state() & QMouseEvent::ControlButton) + { + pickingColor=true; + setCursor (pickColorCursor); + return; + } + + if (lmo) + { // MapObj was found + if (selection != lmo) + { + // select the MapObj + if (selection) selection->unselect(); + selection=lmo; + selection->select(); + + adjustCanvasSize(); + } + + // Check, if systemFlag clicked + if (typeid(*selection)==typeid(BranchObj) || + typeid(*selection)==typeid(MapCenterObj) ) + { + QString foname=((BranchObj*)(selection))->getSystemFlagName(p); + if (!foname.isEmpty()) + { + // Do not move, if systemFlag clicked + if (foname=="url") + openURL(); + else + if (foname=="vymLink") + { + mainWindow->editOpenVymLink(); + // tabWidget may change, better return now + // before segfaulting... + return; + } else + if (foname=="note") + mainWindow->windowToggleNoteEditor(); + } + } + + // Left Button Move Branches + if (e->button() == QMouseEvent::LeftButton ) + { + movingObj=selection; + movingObj_start.setX( p.x() - selection->x() ); + movingObj_start.setY( p.y() - selection->y() ); + } else + // Middle Button Toggle Scroll + // (On Mac OS X this won't work, but we still have + // a button in the toolbar) + if (e->button() == QMouseEvent::MidButton ) + { + toggleScroll(); + } + updateActions(); + } else + { // No MapObj found, we are on the Canvas itself + // Left Button move Pos of CanvasView + if (e->button() == QMouseEvent::LeftButton ) + { + movingObj=NULL; // move Content not Obj + movingObj_start=e->globalPos(); + movingCont_start=QPoint (contentsX(), contentsY() ); + movingVec=QPoint(0,0); + setCursor(handOpenCursor); + } + } +} + +void MapEditor::contentsMouseMoveEvent(QMouseEvent* e) +{ + // Move the selected MapObj + if ( selection && movingObj) + { + QPoint p = inverseWorldMatrix().map(e->pos()); + + // Now move the selection, but add relative position (movingObj_start) + // where selection + // was chosen with mousepointer. (This avoids flickering resp. jumping + // of selection back to absPos) + + LinkableMapObj *lmosel; + lmosel = dynamic_cast <LinkableMapObj*> (selection); + + // Check if we could link + LinkableMapObj* lmo=mapCenter->findMapObj(p, lmosel); + + + if (typeid(*selection) == typeid(FloatImageObj)) + { + setChanged(); + saveState(); + FloatObj *fo=(FloatObj*)(selection); + if (fo->getLinkStyle()==StyleUndef) + { + fo->setLinkStyle(fo->getDefLinkStyle()); + fo->setLinkColor(fo->getParObj()->getLinkColor()); + } + fo->move (p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); + fo->setRelPos(); + fo->reposition(); + + // Relink float to new mapcenter or branch, if shift is pressed + // Only relink, if selection really has a new parent + if ( (e->state() & QMouseEvent::ShiftButton) && lmo && + ( (typeid(*lmo)==typeid(BranchObj)) || + (typeid(*lmo)==typeid(MapCenterObj)) ) && + ( lmo != fo->getParObj()) + ) + { + if (typeid(*fo) == typeid(FloatImageObj)) + { + FloatImageObj *fio=(FloatImageObj*)(fo); + ((BranchObj*)(lmo))->addFloatImage (fio); + fio->unselect(); + ((BranchObj*)(fio->getParObj()))->removeFloatImage (fio); + fio=((BranchObj*)(lmo))->getLastFloatImage(); + fio->setRelPos(); + fio->reposition(); + selection=(LinkableMapObj*)(fio); + selection->select(); + movingObj=(MapObj*)(fio); + // setLinkStyle calls updateLink, only set it once + if (fio->getLinkStyle()!=fio->getDefLinkStyle() ) + fio->setLinkStyle (fio->getDefLinkStyle()); + + } + // TODO if (typeid(*selection) == typeid(FloatTextObj)) + } + } else // selection != a FloatObj + { + if (lmosel->getDepth()==0) + { + if (e->state() == (LeftButton | !ShiftButton)) + // If mapCenter is moved, move all the rest by default, too. + mapCenter->moveAll(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); + else + mapCenter->move (p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); + } else + { + if (lmosel->getDepth()==1) + { + // depth==1, mainbranch + setChanged(); + saveState(PartOfMap,lmosel); + lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); + } else + { + // depth>1 + if (lmosel->getOrientation() == OrientLeftOfCenter) + // Add width of bbox here, otherwise alignRelTo will cause jumping around + lmosel->move(p.x() -movingObj_start.x()+lmosel->getBBox().width(), + p.y()-movingObj_start.y() ); + else + lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); + } + // reposition subbranch + lmosel->reposition(); + ensureSelectionVisible(); + + if (lmo && (lmo!=selection) && + (typeid(*lmo) == typeid(BranchObj) || + (typeid(*lmo) == typeid(MapCenterObj) ) + ) ) + { + if (e->state() & QMouseEvent::ControlButton) + { + // Special case: CTRL to link below lmo + lmosel->setParObjTmp (lmo,p,+1); + } + else if (e->state() & QMouseEvent::ShiftButton) + lmosel->setParObjTmp (lmo,p,-1); + else + lmosel->setParObjTmp (lmo,p,0); + } else + { + if (lmo &&(lmo==selection)) + // Could link to myself (happens sometimes...) + lmosel->unsetParObjTmp(); + if (!lmo) + // no Obj under selection, go back to original Parent + lmosel->unsetParObjTmp(); + } + } // depth>0 + + } // no FloatImageObj + + canvas()->update(); + return; + } // selection && moving_obj + + // Move CanvasView + if (!movingObj && !pickingColor) + { + QPoint p=e->globalPos(); + movingVec.setX(-p.x() + movingObj_start.x() ); + movingVec.setY(-p.y() + movingObj_start.y() ); + setContentsPos( movingCont_start.x() + movingVec.x(), + movingCont_start.y() + movingVec.y()); + + updateViewCenter(); + } +} + + +void MapEditor::contentsMouseReleaseEvent(QMouseEvent* e) +{ + LinkableMapObj *dst; + // Have we been picking color? + if (pickingColor) + { + pickingColor=false; + setCursor (ArrowCursor); + // Check if we are over another branch + dst=mapCenter->findMapObj(inverseWorldMatrix().map(e->pos() ), NULL); + if (dst && selection) + { + if (e->state() & QMouseEvent::ShiftButton) + { + ((BranchObj*)(selection))->setColor (((BranchObj*)(dst))->getColor(),false); + ((BranchObj*)(selection))->setLinkColor (); + } + else + { + ((BranchObj*)(selection))->setColor (((BranchObj*)(dst))->getColor(),true); + ((BranchObj*)(selection))->setLinkColor (); + } + } + return; + } + // Have we been moving something? + if ( selection && movingObj ) + { + // Check if we are over another branch, but ignore + // any found LMOs, which are FloatObjs + dst=mapCenter->findMapObj(inverseWorldMatrix().map(e->pos() ), + ((LinkableMapObj*)(selection)) ); + + if (dst && + (typeid(*dst)!=typeid(BranchObj)&&typeid(*dst)!=typeid(MapCenterObj))) + { + dst=NULL; + } + + // Now check, if we have been moving a branch + if (typeid(*selection) == typeid(BranchObj) ) + { + // save the position in case we link to mapcenter + QPoint savePos=QPoint (selection->x(),selection->y() ); + + // Reset the temporary drawn link to the original one + ((LinkableMapObj*)(selection))->unsetParObjTmp(); + + if (dst ) + { + setChanged(); + saveState(); + // TODO we also could check, if dest and src are on same branch, + // then it would be sufficient to saveState of this branch + + // FIXME better introduce BO::move to speed up and keep IDs + copy(); // copy selection to clipboard + cutNoSave(); // remove selection here + + selection->unselect(); + selection=dst; + // Modifiers allow to insert above/below dst + if (e->state() & QMouseEvent::ShiftButton) + { + selection=pasteAtNoSave (((BranchObj*)(dst))->getNum()); + if (selection) selection->select(); + } + else if (e->state() & QMouseEvent::ControlButton) + { + selection=pasteAtNoSave (((BranchObj*)(dst))->getNum()+1); + if (selection) selection->select(); + } + else + { + selection=pasteNoSave(); + selection->select(); + if (dst->getDepth()==0) + ((BranchObj*)(selection))->move (savePos); + } + } + // Draw the original link, before selection was moved around + mapCenter->reposition(); + } + // Finally resize canvas, if needed + adjustCanvasSize(); + canvas()->update(); + movingObj=NULL; + } else + { // maybe we moved View: set old cursor + setCursor (ArrowCursor); + } +} + +void MapEditor::contentsMouseDoubleClickEvent(QMouseEvent* e) +{ + // Finish open lineEdits + if (lineedit) finishedLineEditNoSave(); + + if (e->button() == QMouseEvent::LeftButton ) + { + QPoint p = inverseWorldMatrix().map(e->pos()); + LinkableMapObj *lmo=mapCenter->findMapObj(p, NULL); + if (lmo) { // MapObj was found + // First select the MapObj than edit heading + if (selection) selection->unselect(); + selection=lmo; + selection->select(); + setChanged(); + saveState(PartOfMap,selection); + editHeading(); + } + } +} + +void MapEditor::resizeEvent (QResizeEvent* e) +{ + QCanvasView::resizeEvent( e ); + + QString s=""; + if (!fileName.isEmpty()) s=fileName; + adjustCanvasSize(); +} + diff -r 000000000000 -r 7a96bd401351 mapeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapeditor.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,197 @@ +#ifndef MAPEDITOR_H +#define MAPEDITOR_H + +#include <qcanvas.h> +#include <qlineedit.h> +#include <qcursor.h> +#include <qfiledialog.h> +#include <qevent.h> +#include <qprocess.h> + +#include "mapcenterobj.h" +#include "misc.h" + +class MapEditor : public QCanvasView , public xmlObj { + Q_OBJECT + +public: + MapEditor(QWidget* parent=0, bool interactive=false, const char* name=0, WFlags f=0); + ~MapEditor(); + QColor color(); + QColor backgroundColor(); + MapCenterObj* getMapCenter(); + QCanvas* getCanvas(); + void adjustCanvasSize();// adjust canvas size to map and scrollview + bool blockReposition(); // block while load or undo + +private: + void makeTmpDirs(); // create temporary directories + void delTmpDirs(); // delete temporary directories + void makeSubDirs(const QString&); + // create subdirs in dir + QString saveToDir(const QString&,const QString &,bool, const QPoint + &,SaveMode); + void saveState(); // save actual state to backup + void saveState(const SaveMode&, LinkableMapObj *); + +private slots: + void finishedLineEditNoSave(); + +public: + bool isDefault(); // false, if map was changed once + bool isUnsaved(); // save necessary + bool hasChanged(); // undo possible + void setChanged(); // called from NoteEditor via LMO + void closeMap(); + void setFilePath (QString); + void setFilePath (QString,QString); + QString getFilePath (); // Full path e.g. "/home/tux/map.xml" + QString getFileName (); // e.g. "map.xml" + QString getMapName (); // e.g. "map" + QString getDestPath (); // e.g. "/home/tux/map.vym" + int load (QString&, const LoadMode &); // newmap, import/replace selection + int save(const SaveMode &); // Save map + void setZipped(bool); // save map zipped + bool saveZipped(); // 1 if file will be saved zipped + void print(); // print canvas +private: + QPixmap getPixmap(); +public: + void exportImage (QString fn); // export as PNG + void exportImage (QString fn, int); // export in given format + void exportASCII(); + void exportXML(const QString&); // export to directory + void clear(); // clear map + void undo(); // undo last action + void copy(); // copy branch to clipboard +private: + LinkableMapObj* pasteNoSave(); // paste clipboard to branch + LinkableMapObj* pasteAtNoSave(int); // paste clipboard to branch at position i + void cutNoSave(); // cut to clipboard +public: + void paste(); // paste clipboard to branch and backup + void cut(); // cut to clipboard and backup + void moveBranchUp(); + void moveBranchDown(); + void editHeading(); + void addNewBranch(int); // pos allows to add above/below selection + void deleteSelection(); + LinkableMapObj* getSelection(); // returns selection + bool select(QString ); // Select + void unselect(); // before changing current noteedit + void reselect(); // after changing current noteedit +private: + void selectNextBranch(); // Increment number of branch + void selectPrevBranch(); // Decrement number of branch +public: + void selectUpperBranch(); + void selectLowerBranch(); + void selectLeftBranch(); + void selectRightBranch(); + void selectFirstBranch(); + void selectLastBranch(); + void setColor(QColor); + void selectBackgroundColor(); + void setBackgroundColor(QColor); + QColor pickColor(); + void colorItem(); + void colorBranch(); + void toggleStandardFlag(QString); + virtual void setViewCenter(); // needed for zooming + BranchObj* findText(QString,bool); // Find object + void findReset(); // Reset Find + void openURL(); // open URL in external browser + void editURL(); // edit the URL + void editHeading2URL(); // copy heading to URL + void editBugzilla2URL(); // create URL to Bugzilla + void editVymLink(); // edit link to another map + void deleteVymLink(); // delete link to another map + QString getVymLink(); // return path to map + void editMapInfo(); // dialog to enter author, ... + void updateActions(); // update e.g. format buttons + void setLinkStyle (LinkStyle); // Set style of link + LinkStyle getLinkStyle (); // requested in LMO + void setLinkColor(QColor); // default color of links + void setLinkColorHint(); // color of links + void setLinkColorHint(LinkColorHint); // color of links + LinkColorHint getLinkColorHint(); + QColor getDefLinkColor(); + void toggleLinkColorHint(); // after changing linkStyles + void selectLinkColor(); + void toggleScroll(); + void unScrollAll(); + void loadFloatImage (); + void saveFloatImage (int); + void toggleFloatExport(); + void setFrame(const FrameType &); +private: + void importDir(BranchObj *,QDir); +public: + void importDir(); + void testFunction(); // FIXME just testing + +protected: + void ensureSelectionVisible(); + virtual void updateViewCenter(); // needed for zooming + virtual void contentsContextMenuEvent ( QContextMenuEvent *e ); + virtual void contentsMousePressEvent(QMouseEvent*); + virtual void contentsMouseReleaseEvent(QMouseEvent*); + virtual void contentsMouseDoubleClickEvent(QMouseEvent*); + virtual void contentsMouseMoveEvent(QMouseEvent*); + +private: + QCanvas* mapCanvas; + MapCenterObj* mapCenter; + + bool adjustCanvasRequested; // collect requests until end of user event + BranchObj *editingBO; // entering Text into BO + QLineEdit* lineedit; + + QColor actColor; // actual color + QColor deflinkcolor; // default color for links + LinkColorHint linkcolorhint;// use heading color or own color + LinkStyle linkstyle; // default style for links + + QCursor handOpenCursor; // cursor while moving canvas view + QCursor pickColorCursor; // cursor while picking color + bool pickingColor; // true while picking Color CTRL-LeftButton + + LinkableMapObj* selection; // select a LinkableMapObj + LinkableMapObj* selectionLast; // last selection + MapObj* movingObj; // moving a MapObj + QPoint movingObj_start; // rel. pos of mouse to absPos + QPoint movingCont_start; // inital pos of moving Content or + QPoint movingVec; // how far has Content moved + QPoint movingCenter; // used when zooming + QPrinter* printer; // Printing + + bool mapDefault; // Flag if map is untouched + bool mapChanged; // Flag if undo is possible + bool mapUnsaved; // Flag if map should be saved + QString backupXML; // backup (XML) for undo + LinkableMapObj* undoSelection; // replace this LMO with vympart from backup + // if != NULL + + bool printFrame; // Print frame around map + bool printFooter; // Print footer below map + + bool zipped; // should map be zipped + QString fileName; // short name of file (for tab) + QString filePath; // path to file which will be saved + QString fileDir; // dir where file is saved + QString destPath; // path to .vym file (needed for vymlinks) + QString mapName; // fileName without ".vym" + QString lastImageDir; // save dir for adding images + + bool isInteractive; // non interactive don't need tmpdirs + QString bakMapDir; // tmp directory with data for undo + bool blockreposition; // block while load or undo + + BranchObj* itFind; // next object in find process + bool EOFind; // true, if search failed + + QPoint exportOffset; // set before export, used in save + void resizeEvent( QResizeEvent * ); +}; +#endif + diff -r 000000000000 -r 7a96bd401351 mapobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,143 @@ +#include "mapobj.h" + +///////////////////////////////////////////////////////////////// +// MapObj +///////////////////////////////////////////////////////////////// +MapObj::MapObj () +{ + // TODO not used any longer... + cout << "Const MapObj (): Please set canvas somehow!!!\n"; + // canvas=actMapEditor->getCanvas(); + init (); +} + +MapObj::MapObj (QCanvas* c) +{ +// cout << "Const MapObj\n"; + canvas=c; + init (); +} + + +MapObj::MapObj (MapObj* mo) +{ +// cout << "CopyConst MapObj\n"; + copy (mo); +} + +MapObj::~MapObj () +{ +// cout << "Destr MapObj\n"; +} + +void MapObj::init () +{ + absPos=QPoint(0,0); + visible=true; +} + +void MapObj::copy(MapObj* other) +{ +// canvas=other->canvas; // already set in constr. of child, use that one... + absPos=other->absPos; + bbox.setX (other->bbox.x() ); + bbox.setY (other->bbox.y() ); + bbox.setSize (QSize(other->bbox.width(), other->bbox.height() ) ); +} + +QCanvas* MapObj::getCanvas() +{ + return canvas; +} + +int MapObj::x() +{ + return absPos.x(); +} + +int MapObj::y() +{ + return absPos.y(); +} + +int MapObj::width() +{ + return bbox.width(); +} + +int MapObj::height() +{ + return bbox.height(); +} + +void MapObj::move (double x, double y) +{ + int xi=static_cast <int> (x); + int yi=static_cast <int> (y); + absPos.setX( xi); + absPos.setY( yi); + bbox.moveTopLeft(QPoint(xi,yi)); +} + +void MapObj::moveBy (double x, double y) +{ + move (x+absPos.x(),y+absPos.y() ); +} + +bool MapObj::inBBox(QPoint p) +{ + if (p.x() >= bbox.left() && p.x() <= bbox.right() + && p.y() <= bbox.bottom() && p.y() >= bbox.top() ) + return true; + return false; +} + +QRect MapObj::getBBox() +{ + return bbox; +} + +QRect MapObj::addBBox(QRect r1, QRect r2) +{ + QRect n; + // Set left border + if (r1.left() <= r2.left() ) + n.setLeft(r1.left() ); + else + n.setLeft(r2.left() ); + + // Set top border + if (r1.top() <= r2.top() ) + n.setTop(r1.top() ); + else + n.setTop(r2.top() ); + + // Set right border + if (r1.right() <= r2.right() ) + n.setRight(r2.right() ); + else + n.setRight(r1.right() ); + + // Set bottom + if (r1.bottom() <= r2.bottom() ) + n.setBottom(r2.bottom() ); + else + n.setBottom(r1.bottom() ); + return n; +} + +QSize MapObj::getSize() +{ + return bbox.size(); +} + + +bool MapObj::isVisibleObj() +{ + return visible; +} + +void MapObj::setVisibility(bool v) +{ + visible=v; +} diff -r 000000000000 -r 7a96bd401351 mapobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mapobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,48 @@ +#ifndef MAPOBJ_H +#define MAPOBJ_H + +#include <qcanvas.h> +#include <iostream> + +#include "misc.h" + +using namespace std; + +#define Z_BBOX 0 +#define Z_LINK 20 +#define Z_FRAME 50 +#define Z_SELBOX 60 +#define Z_ICON 80 +#define Z_TEXT 100 + +class MapObj:public xmlObj { +public: + MapObj (); + MapObj (QCanvas*); + MapObj (MapObj*); + virtual ~MapObj (); + virtual void init (); + virtual void copy (MapObj*); + virtual QCanvas* getCanvas(); + virtual int x(); + virtual int y(); + virtual int width(); + virtual int height(); + virtual void move (double x,double y); // move to absolute Position + virtual void moveBy (double x,double y); // move to relative Position + virtual bool inBBox(QPoint); // Check if Point is in bbox + virtual QRect getBBox(); // returns bounding box + virtual QRect addBBox(QRect,QRect); // returns bbox which includes both boxes + virtual QSize getSize(); // returns size of bounding box + virtual bool isVisibleObj(); + virtual void setVisibility(bool); +protected: + QCanvas* canvas; + QRect bbox; // bounding box of MO itself + virtual void positionBBox()=0; + virtual void calcBBoxSize()=0; + QPoint absPos; // Position on canvas + bool visible; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 misc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,238 @@ +#include <qregexp.h> +#include <qpoint.h> + +#include <math.h> + +#include "misc.h" + + +ostream &operator<< (ostream &stream, QPoint const &p) +{ + return (stream << "(" << p.x() << "," << p.y() << ")"); +} + +float getAngle(const QPoint &p) +{ + // Calculate angle of vector to y-axis + if (p.y()==0) + { + if (p.x()>=0) + return M_PI_2; + else + return 3* M_PI_2; + } else + { + if (p.y()>0) + return (float)(M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) ); + else + if (p.x()<0) + return (float)( 2*M_PI - atan ( (double)(p.x()) / (double)(p.y()) ) ); + else + return (float)( - atan ( (double)(p.x()) / (double)(p.y()) ) ); + } +} + +QPoint normalise(const QPoint &p) +{ + // Calculate normalised position (fixed length) + + double px=p.x(); + double py=p.y(); + double x; + double y; + double r=150; + + if (px==0) + { + x=0; + if (py>=0) + y=r; + else + y=-r; + } else + { + double sign; + double a; + if (px>0) + sign=1; + else + sign=-1; + + a=atan (py / px); + x=cos (a) * r *sign; + y=sin (a) * r *sign; + } + return QPoint ((int) (x),(int) (y)); +} + +QString maskPath(QString p) +{ + // Change " " to "\ " to enable blanks in filenames + p=p.replace(QChar('&'),"\\&"); + return p.replace(QChar(' '),"\\ "); +} + +QString convertToRel (const QString &src, const QString &dst) +{ + QString s=src; + QString d=dst; + int i; + // Find relative path from src to dst + + // Remove the first "/" + if (s.section ("/",0,0).isEmpty()) + { + s=s.right (s.length()-1); + d=d.right (d.length()-1); + } + + // remove identical left parts + while (s.section("/",0,0) == d.section("/",0,0) ) + { + i=s.find ("/"); + s=s.right (s.length()-i-1); + d=d.right (d.length()-i-1); + } + + int srcsep=s.contains("/"); + int dstsep=d.contains("/"); + if (srcsep >= dstsep ) + { + // find path to go up first and then back to dst + i=1; + while (i<=srcsep) + { + d="../"+d; + i++; + } + } + return d; +} + +// returns masked "<" ">" "&" +QString quotemeta(const QString &s) +{ + QString r=s; + QRegExp rx("&(?!amp;)"); + r.replace ( rx,"&"); + rx.setPattern( ">"); + r.replace ( rx,">"); + rx.setPattern( "<"); + r.replace ( rx,"<"); + rx.setPattern( "\""); + r.replace ( rx,"""); + return r; +} + +int max(int a, int b) +{ + if (a>b) + return a; + return b; +} + +int xmlObj::actindent=0; // make instance of actindent + +xmlObj::xmlObj() +{ + indentwidth=4; +} + + +// returns <s at /> +QString xmlObj::singleElement(QString s, QString at) +{ + return indent() + "<" + s +" " + at +" " + "/>\n"; +} + +// returns <s> +QString xmlObj::beginElement(QString s) +{ + return indent() + "<" + s + ">\n"; +} + +// returns <s at> +QString xmlObj::beginElement(QString s, QString at) +{ + return indent() + "<" + s + " " + at + ">\n"; +} + +// returns </s> +QString xmlObj::endElement(QString s) +{ + return indent() + "</" + s + ">\n"; +} + +// returns at="val" +QString xmlObj::attribut(QString at, QString val) +{ + return " " + at + "=\"" + quotemeta (val) + "\""; +} + +// returns <s> val </s> +QString xmlObj::valueElement(QString el, QString val) +{ + return indent() + "<" + el + ">" + quotemeta(val) + "</" +el + ">\n"; +} + +// returns <s at> val </s> +QString xmlObj::valueElement(QString el, QString val, QString at) +{ + return indent() + "<" + el + " " + at + ">" + quotemeta(val) + "</" +el + ">\n"; +} + +void xmlObj::incIndent() +{ + actindent++; +} + +void xmlObj::decIndent() +{ + actindent--; + if (actindent<0) actindent=0; +} + +QString xmlObj::indent() +{ + QString s; + int i; + for (i=0; i<actindent*indentwidth; i++) + { + s= s + " "; + } + return s; +} + + + +ImagePreview::ImagePreview (QWidget *parent=0): QLabel (parent) +{ +} + +void ImagePreview::previewUrl( const QUrl &u ) +{ + QString path = u.path(); + QPixmap pix( path ); + if ( pix.isNull() ) + setText( QObject::tr("This is not an image.") ); + else + { + float max_w=300; + float max_h=300; + float r; + if (pix.width()>max_w) + { + r=max_w / pix.width(); + pix.resize(lrint(pix.width()*r), lrint(pix.height()*r)); + // TODO not a resize, but a shrink/enlarge is needed here... + } + if (pix.height()>max_h) + { + r=max_h / pix.height(); + pix.resize(lrint(pix.width()*r), lrint(pix.height()*r)); + // TODO not a resize, but a shrink/enlarge is needed here... + } + setPixmap( pix ); + } +} + diff -r 000000000000 -r 7a96bd401351 misc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/misc.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,64 @@ +#ifndef MISC_H +#define MISC_H + +#include <qpoint.h> +#include <iostream> + +using namespace std; + +#define Z_BBOX 0 +#define Z_LINK 20 +#define Z_FRAME 50 +#define Z_SELBOX 60 +#define Z_ICON 80 +#define Z_TEXT 100 + +enum LoadMode {NewMap,ImportAdd,ImportReplace}; +enum SaveMode {PartOfMap,CompleteMap}; + +///////////////////////////////////////////////////////////////////////////// +extern ostream &operator<< (ostream &stream, QPoint const &p); +float getAngle(const QPoint &); +QPoint normalise (const QPoint &); +QString maskPath (QString ); +QString convertToRel (const QString &,const QString &); +QString quotemeta(const QString&); +int max (int,int); +class BranchObj; +class MapEditor; + +///////////////////////////////////////////////////////////////////////////// +class xmlObj +{ +public: + xmlObj(); + QString singleElement(QString,QString); + QString beginElement(QString,QString); + QString beginElement(QString); + QString endElement (QString); + QString attribut (QString,QString); + QString valueElement(QString,QString); + QString valueElement(QString,QString,QString); + void incIndent(); + void decIndent(); + static int actindent; + +protected: + QString indent(); + int indentwidth; +}; + +///////////////////////////////////////////////////////////////////////////// + +#include <qlabel.h> +#include <qfiledialog.h> +#include <qpixmap.h> + +class ImagePreview : public QLabel, public QFilePreview +{ +public: + ImagePreview( QWidget * ); + void previewUrl( const QUrl & ); +}; + +#endif diff -r 000000000000 -r 7a96bd401351 noteobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/noteobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,105 @@ +#include <qfile.h> +#include <qtextstream.h> +#include <qmessagebox.h> +#include <qregexp.h> + +#include "noteobj.h" + +///////////////////////////////////////////////////////////////// +// NoteObj +///////////////////////////////////////////////////////////////// + +NoteObj::NoteObj() +{ + clear(); +} + +void NoteObj::copy (NoteObj other) +{ + note=other.note; + fonthint=other.fonthint; + filenamehint=""; +} + +void NoteObj::clear() +{ + note=""; + fonthint="undef"; + filenamehint=""; +} + +void NoteObj::setNote (const QString &s) +{ + note=s; +} + +QString NoteObj::getNote() +{ + return note; +} + +void NoteObj::setFontHint (const QString &s) +{ + // only for backward compatibility (pre 1.5 ) + fonthint=s; +} + +QString NoteObj::getFontHint() +{ + // only for backward compatibility (pre 1.5 ) + return fonthint; +} + +void NoteObj::setFilenameHint (const QString &s) +{ + filenamehint=s; +} + +QString NoteObj::getFilenameHint() +{ + return filenamehint; +} + +bool NoteObj::isEmpty () +{ + return note.isEmpty(); +} + +QString NoteObj::saveToDir () +{ + // QTextEdit may generate fontnames with unquoted &, like + // in "Lucida B&H". This is invalid in XML and thus would crash + // the XML parser + uint pos=0; + uint pos2; + bool inbracket=false; + bool inquot=false; + while (pos<note.length()) + { + if (note.mid(pos,1)=="<") inbracket=true; + if (note.mid(pos,1)==">") inbracket=false; + if (note.mid(pos,1)=="\"" && inbracket) + { + if (!inquot) + inquot=true; + else + inquot=false; + } + if (note.mid(pos,1)=="&" && inquot) + { + // Now we are inside < " " > + // look for ending " + pos2=pos+1; + while (note.mid(pos2,1)!=";" && note.mid(pos2,1)!="\"") + pos2++; + if (note.mid(pos2,1)=="\"") + { + note.replace(pos,1,"&"); + pos=pos2; + } + } + pos++; + } + return beginElement ("htmlnote",attribut("fonthint",fonthint)) + "\n"+ note+ "\n" +endElement ("htmlnote"); +} + diff -r 000000000000 -r 7a96bd401351 noteobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/noteobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,30 @@ +#ifndef NOTEOBJ_H +#define NOTEOBJ_H + +#include <qstring.h> + +class NoteObj; + +#include "misc.h" + +class NoteObj:public xmlObj +{ +public: + NoteObj(); + void copy (NoteObj); + void clear(); + void setNote (const QString&); + QString getNote(); + void setFontHint (const QString&); + QString getFontHint (); + void setFilenameHint (const QString&); + QString getFilenameHint (); + bool isEmpty(); + QString saveToDir(); + +private: + QString note; + QString fonthint; + QString filenamehint; +}; +#endif diff -r 000000000000 -r 7a96bd401351 options.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/options.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,144 @@ +#include "options.h" +#include <iostream> + +#include <qapplication.h> + +using namespace std; + + +Option::Option() +{ + name=""; + sName=""; + lName=""; + type=SwitchOption; + sarg=""; + active=false; +} + +void Option::set(const QString &n, const OptionType &t, const QString &s, const QString &l) +{ + sName="-"+s; + lName="--"+l; + type=t; + name=n; +} + +QString Option::getName () { return name; } +QString Option::getShort () { return sName; } +QString Option::getLong() { return lName; } +OptionType Option::getType() { return type; } +void Option::setArg(const QString& s) { sarg=s; } +QString Option::getArg() { return sarg; } +void Option::setActive() { active=true; } +bool Option::isActive() { return active; } + +/////////////////////////////////////////////////////////////// +Options::Options() {} + +int Options::parse() +{ + QStringList arglist; + int i=0; + while (i<qApp->argc()) + { + arglist.append (qApp->argv()[i]); + i++; + } + + // Get program name + progname=arglist.first(); + arglist.pop_front(); + + // Work through rest of options + bool isFile; + OptionList::iterator itopt; + QStringList::iterator itarg; + itarg=arglist.begin(); + while (itarg!=arglist.end()) + { + isFile=true; + if ((*itarg).left(1)=="-") + { + // Compare given option to all defined options + itopt=optlist.begin(); + while (itopt!=optlist.end()) + { + if ((*itarg)==(*itopt).getShort() || + (*itarg)==(*itopt).getLong()) + { + (*itopt).setActive(); + isFile=false; + if ((*itopt).getType()==StringOption) + { + itarg++; + if (itarg==arglist.end()) + { + cout << "Error: argument to option missing\n"; + return 1; + } + (*itopt).setArg (*itarg); + isFile=false; + } + break; + } + itopt++; + } + if (isFile) + { + cout << "Error: Unknown argument "<<*itarg<<endl; + return 1; + } + } else + filelist.append (*itarg); + itarg++; + } + return 0; +} + +void Options::add (const QString &n, const OptionType &t=SwitchOption, const QString &s="", const QString &l="") +{ + Option o; + o.set (n,t,s,l); + optlist.append (o); +} + +void Options::setHelpText (const QString &s) +{ + helptext=s; +} + +QString Options::getHelpText () +{ + return helptext; +} + +QString Options::getProgramName() +{ + return progname; +} + +QStringList Options::getFileList () +{ + return filelist; +} + +bool Options::isOn(const QString &s) +{ + OptionList::iterator it; + for ( it = optlist.begin(); it != optlist.end(); ++it ) + if ((*it).getName()==s && (*it).isActive() ) + return true; + return false; +} + +QString Options::getArg(const QString &s) +{ + OptionList::iterator it; + for ( it = optlist.begin(); it != optlist.end(); ++it ) + { + if ((*it).getName()==s) + return (*it).getArg(); + } + return ""; +} diff -r 000000000000 -r 7a96bd401351 options.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/options.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,55 @@ +#ifndef OPTIONS_H +#define OPTIONS_H + +#include <qstring.h> +#include <qstringlist.h> + +enum OptionType {SwitchOption,StringOption}; + +class Option +{ +public: + Option(); + void set (const QString &, const OptionType &, const QString &, const QString &); + QString getName(); + QString getShort(); + QString getLong(); + OptionType getType(); + void setArg(const QString &); + QString getArg(); + void setActive(); + bool isActive(); +private: + QString name; + OptionType type; + QString sName; + QString lName; + QString sarg; + bool active; +}; + + + +typedef QValueList <Option> OptionList; + +class Options +{ +public: + Options(); + int parse(); + void add (const QString &,const OptionType &, const QString &, const QString&); + void setHelpText(const QString&); + QString getHelpText(); + QString getProgramName(); + QStringList getFileList(); + bool isOn (const QString &); + QString getArg (const QString &); + +private: + QString progname; + QString helptext; + QStringList filelist; + OptionList optlist; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 ornamentedobj.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ornamentedobj.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,211 @@ +#include "ornamentedobj.h" +#include "texteditor.h" +#include "mapeditor.h" +#include "linkablemapobj.h" + +extern TextEditor *textEditor; +extern FlagRowObj *systemFlagsDefault; +extern FlagRowObj *standardFlagsDefault; + + +///////////////////////////////////////////////////////////////// +// OrnamentedObj +///////////////////////////////////////////////////////////////// + +OrnamentedObj::OrnamentedObj():LinkableMapObj() +{ + // cout << "Const OrnamentedObj ()\n"; + init (); +} + +OrnamentedObj::OrnamentedObj(QCanvas* c) :LinkableMapObj(c) +{ +// cout << "Const OrnamentedObj\n"; + init (); +} + +OrnamentedObj::OrnamentedObj (OrnamentedObj* lmo) : LinkableMapObj (lmo->canvas) +{ + copy (lmo); +} + +OrnamentedObj::~OrnamentedObj() +{ + delete (heading); + delete (systemFlags); + delete (standardFlags); + +} + + +void OrnamentedObj::init () +{ + heading = new HeadingObj(canvas); + heading->move (absPos.x(), absPos.y()); + + note.setNote(""); + note.setFontHint (textEditor->getFontHintDefault() ); + + systemFlags=new FlagRowObj(canvas); + systemFlags->clone(systemFlagsDefault); + systemFlags->setName ("systemFlags"); + + standardFlags=new FlagRowObj(canvas); + standardFlags->clone(standardFlagsDefault); + standardFlags->setName ("standardFlags"); + + + +} + +void OrnamentedObj::copy (OrnamentedObj* other) +{ + LinkableMapObj::copy(other); + heading->copy(other->heading); + setColor (other->heading->getColor(),false); + + note.copy (other->note); + systemFlags->copy (other->systemFlags); + standardFlags->copy (other->standardFlags); + +} + +QString OrnamentedObj::getHeading() +{ + return heading->text(); +} + +void OrnamentedObj::setLinkColor() +{ + if (mapEditor->getLinkColorHint()==HeadingColor) + LinkableMapObj::setLinkColor (heading->getColor()); + else + LinkableMapObj::setLinkColor (mapEditor->getDefLinkColor()); +} + +QColor OrnamentedObj::getColor () +{ + return heading->getColor(); +} + + +void OrnamentedObj::move (double x, double y) +{ + MapObj::move (x,y); + double dx=frame->getBorder()/2; // care for border around object + double dy=frame->getBorder()/2; + systemFlags-> move (x + dx, y + dy); + + // vertical align heading to bottom + int h=max (systemFlags->getBBox().height(), standardFlags->getBBox().height()); + h=max (h,heading->getHeight()); + heading->move (x + dx + systemFlags->getBBox().width(), + y + dy + h - heading->getHeight() + ); + standardFlags->move (x + heading->getWidth() + systemFlags->getBBox().width(), y + dy ); + + updateLink(); + requestReposition(); +} + +void OrnamentedObj::move (QPoint p) +{ + move (p.x(), p.y()); +} + +void OrnamentedObj::moveBy (double x, double y) +{ + + MapObj::moveBy (x,y); + frame->moveBy (x,y); + systemFlags->moveBy (x,y); + standardFlags->moveBy (x,y); + heading->moveBy (x,y); + updateLink(); + requestReposition(); +} + +void OrnamentedObj::moveBy (QPoint p) +{ + moveBy (p.x(), p.y()); +} + +void OrnamentedObj::move2RelPos(double x, double y) +{ + if (!parObj) return; + move (parObj->getChildPos().x()+x, parObj->getChildPos().y()+y); +} + +void OrnamentedObj::move2RelPos(QPoint p) +{ + if (!parObj) return; + move (parObj->getChildPos().x() + p.x(), parObj->getChildPos().y() + p.y() ); +} + +void OrnamentedObj::setNote(QString s) +{ + note.setNote(s); + if (!note.isEmpty()) + systemFlags->activate("note"); + else + systemFlags->deactivate("note"); + calcBBoxSize(); + positionBBox(); + move (absPos.x(), absPos.y() ); + forceReposition(); +} + +void OrnamentedObj::setNote(NoteObj n) +{ + note=n; + if (!note.isEmpty()) + systemFlags->activate("note"); + else + systemFlags->deactivate("note"); + calcBBoxSize(); + positionBBox(); + move (absPos.x(), absPos.y() ); + forceReposition(); + +} + +QString OrnamentedObj::getNote() +{ + return note.getNote(); +} + +void OrnamentedObj::toggleStandardFlag(QString f) +{ + standardFlags->toggle(f); + calcBBoxSize(); + positionBBox(); + move (absPos.x(), absPos.y() ); + forceReposition(); +} + +void OrnamentedObj::activateStandardFlag(QString f) +{ + standardFlags->activate(f); + calcBBoxSize(); + positionBBox(); + move (absPos.x(), absPos.y() ); + forceReposition(); +} + +QString OrnamentedObj::getSystemFlagName(const QPoint &p) +{ + return systemFlags->getFlagName(p); +} + +void OrnamentedObj::updateNoteFlag() +{ + // text in NoteEditor has changed, notify MapEditor + mapEditor->setChanged(); + + // save text + setNote( textEditor->getText() ); + + // save font + note.setFontHint (textEditor->getFontHint() ); +} + diff -r 000000000000 -r 7a96bd401351 ornamentedobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ornamentedobj.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,47 @@ +#ifndef ORNAMENTEDOBJ_H +#define ORNAMENTEDOBJ_H + +#include "linkablemapobj.h" + +class OrnamentedObj:public LinkableMapObj { + Q_OBJECT +public: + OrnamentedObj (); + OrnamentedObj (QCanvas*); + OrnamentedObj (OrnamentedObj*); + ~OrnamentedObj (); + virtual void init (); + virtual void copy (OrnamentedObj*); + + virtual void setHeading (QString s)=0; // set the heading, pure virtual + // to take care of fontsize + virtual QString getHeading(); // returns the heading + virtual void setLinkColor(); // sets color according to colorhint, overloaded + virtual void setVisibility(bool,int)=0; // set visibility + virtual void setVisibility(bool)=0; // set vis. for w + virtual void setColor(QColor,bool)=0; // set the color of text and link + QColor getColor (); // get color of heading + virtual void move (double,double); + virtual void move (QPoint); + virtual void moveBy (double,double); + virtual void moveBy (QPoint); + virtual void move2RelPos (QPoint); // move relativly to parent^ + virtual void move2RelPos (double,double); + virtual void setNote(QString); // set note + virtual void setNote(NoteObj); // set note + virtual QString getNote(); // returns note + virtual void toggleStandardFlag(QString); + virtual void activateStandardFlag(QString); + virtual QString getSystemFlagName (const QPoint &p); + +public slots: + void updateNoteFlag(); + +protected: + HeadingObj *heading; // Heading + NoteObj note; // Notes + FlagRowObj *systemFlags; // System Flags + FlagRowObj *standardFlags; // Standard Flags +}; + +#endif diff -r 000000000000 -r 7a96bd401351 process.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/process.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,51 @@ +#include "process.h" + +///////////////////////////////////////////////////////////////// +// Process +///////////////////////////////////////////////////////////////// +Process::Process() +{ + connect( this, SIGNAL(readyReadStderr()), + this, SLOT(readProcErrout()) ); + connect( this, SIGNAL(readyReadStdout()), + this, SLOT(readProcStdout()) ); + clear(); +} + +Process::~Process() +{ +} + +void Process::clear() +{ + errOut=""; + stdOut=""; +} + +void Process::waitFinished() +{ + while (isRunning()) + { + // FIXME use some kind of sleep here... + } +} + +void Process::readProcErrout() +{ + errOut+=readStderr(); +} + +void Process::readProcStdout() +{ + stdOut+=readStdout(); +} + +QString Process::getErrout() +{ + return errOut; +} + +QString Process::getStdout() +{ + return stdOut; +} diff -r 000000000000 -r 7a96bd401351 process.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/process.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,31 @@ +#ifndef PROCESS_H +#define PROCESS_H + +#include <qprocess.h> +#include <qstring.h> + + +using namespace std; + +class Process:public QProcess +{ + Q_OBJECT +public: + Process (); + ~Process (); + void clear(); + void waitFinished(); + QString getErrout(); + QString getStdout(); + + +public slots: + virtual void readProcErrout(); + virtual void readProcStdout(); + +private: + QString errOut; + QString stdOut; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 selection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/selection.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,47 @@ +#include "selection.h" + + +Selection::Selection() +{ +} + +Selection::Selection(const Selection &other) +{ +} + +Selection::~Selection() +{ +} + +void Selection::init() +{ + selectList.setAutoDelete(true); +} + +void Selection::copy(const Selection &other) +{ +} + +void Selection::clear() +{ + selectList.clear(); +} + +bool Selection::select(LinkableMapObj *lmo) +{ + return false; +} + +void Selection::unselect(LinkableMapObj *lmo) +{ +} + +bool Selection::isEmpty() +{ + return selectList.isEmpty(); +} + +uint Selection::count() +{ + return selectList.count(); +} diff -r 000000000000 -r 7a96bd401351 selection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/selection.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,26 @@ +#ifndef SELECTIONOBJ_H +#define SELECTIONOBJ_H + +#include "linkablemapobj.h" +#include <qptrlist.h> + +class Selection +{ +public: + Selection (); + Selection (const Selection&); + ~Selection(); + void init(); + void copy(const Selection&); + void clear(); + + bool select (LinkableMapObj*); + void unselect (LinkableMapObj*); + bool isEmpty(); + uint count(); + +private: + QPtrList <LinkableMapObj> selectList; +}; +#endif + diff -r 000000000000 -r 7a96bd401351 settings.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/settings.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,132 @@ +#include <iostream> +#include "settings.h" +#include "misc.h" + +using namespace std; +///////////////////////////////////////////////////////////////// +// Settings +///////////////////////////////////////////////////////////////// +Settings::Settings() +{ + clear(); +} + +Settings::~Settings() +{ +} + +void Settings::clear() +{ + pathlist.clear(); + keylist.clear(); + valuelist.clear(); +} + +void Settings::clearLocal(const QString &s) +{ + QStringList::Iterator itp=pathlist.begin(); + QStringList::Iterator itk=keylist.begin(); + QStringList::Iterator itv=valuelist.begin(); + + while (itp !=pathlist.end() ) + { + if ((*itk).startsWith (s)) + { + itp=pathlist.remove (itp); + itk=keylist.remove (itk); + itv=valuelist.remove (itv); + } else + { + itp++; + itk++; + itv++; + } + } +} + +QString Settings::readLocalEntry ( const QString &fpath, const QString & key, const QString & def = QString::null ) +{ + QStringList::Iterator itp=pathlist.begin(); + QStringList::Iterator itk=keylist.begin(); + QStringList::Iterator itv=valuelist.begin(); + + // First search for value in settings saved in map + while (itp !=pathlist.end() ) + { + if (*itp == fpath && *itk == key) + return *itv; + itp++; + itk++; + itv++; + } + + // Fall back to global vym settings + bool ok; + return readEntry (key,def, &ok); +} + +void Settings::setLocalEntry (const QString &fpath, const QString &key, const QString &value) +{ + QStringList::Iterator itp=pathlist.begin(); + QStringList::Iterator itk=keylist.begin(); + QStringList::Iterator itv=valuelist.begin(); + + if (!fpath.isEmpty() && !key.isEmpty() && !value.isEmpty() ) + { + // Search for existing entry first + while (itp !=pathlist.end() ) + { + if (*itp == fpath && *itk == key) + { + *itv=value; + return; + } + itp++; + itk++; + itv++; + } + + // If no entry exists, append a new one + pathlist.append (fpath); + keylist.append (key); + valuelist.append (value); + } +} + +QString Settings::getXMLData (const QString &fpath) +{ + QString s; + QStringList::Iterator itp=pathlist.begin(); + QStringList::Iterator itk=keylist.begin(); + QStringList::Iterator itv=valuelist.begin(); + + while (itp !=pathlist.end() ) + { + if (*itp == fpath ) + if (!(*itv).isEmpty()) + s+=singleElement ( + "setting", + attribut ("key",*itk) + +attribut ("value",*itv) + )+"\n"; + itp++; + itk++; + itv++; + } + return s; +} + +void Settings::write() +{ + QStringList::Iterator itp=pathlist.begin(); + QStringList::Iterator itk=keylist.begin(); + QStringList::Iterator itv=valuelist.begin(); + + while (itp !=pathlist.end() ) + { + itp++; + itk++; + itv++; + } +} + diff -r 000000000000 -r 7a96bd401351 settings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/settings.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,29 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include <qsettings.h> +#include <qstring.h> +#include <qstringlist.h> + +#include "misc.h" + + +class Settings:public QSettings,public xmlObj +{ +public: + Settings (); + ~Settings (); + void clear(); + void clearLocal (const QString &); + QString readLocalEntry ( const QString &, const QString &, const QString &); + void setLocalEntry (const QString &, const QString &, const QString &); + QString getXMLData (const QString &); + void write (); + +protected: + QStringList pathlist; + QStringList keylist; + QStringList valuelist; +}; + +#endif diff -r 000000000000 -r 7a96bd401351 showtextdialog.ui --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/showtextdialog.ui Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,135 @@ +<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<class>ShowTextDialog</class> +<author>Uwe Drechsel</author> +<widget class="QDialog"> + <property name="name"> + <cstring>ShowTextDialog</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>560</width> + <height>383</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="backgroundOrigin"> + <enum>WidgetOrigin</enum> + </property> + <property name="caption"> + <string>VYM - Info</string> + </property> + <property name="sizeGripEnabled"> + <bool>false</bool> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QTextEdit"> + <property name="name"> + <cstring>textEdit1</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>141</width> + <height>21</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton4</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>150</width> + <height>32767</height> + </size> + </property> + <property name="text"> + <string>Close</string> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + </vbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>pushButton4</sender> + <signal>clicked()</signal> + <receiver>ShowTextDialog</receiver> + <slot>accept()</slot> + </connection> +</connections> +<includes> + <include location="local" impldecl="in implementation">showtextdialog.ui.h</include> +</includes> +<slots> + <slot access="private">init()</slot> + <slot>setText( const QString & t )</slot> + <slot>append( const QString & t )</slot> +</slots> +<pixmapinproject/> +<layoutdefaults spacing="6" margin="11"/> +</UI> diff -r 000000000000 -r 7a96bd401351 showtextdialog.ui.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/showtextdialog.ui.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,18 @@ +void ShowTextDialog::init() +{ + textEdit1->setReadOnly (true); +} + + +void ShowTextDialog::setText(const QString &t) +{ + textEdit1->setText (t); +} + + + + +void ShowTextDialog::append( const QString &t ) +{ + textEdit1->append (t); +} diff -r 000000000000 -r 7a96bd401351 tex/color-buttons.png Binary file tex/color-buttons.png has changed diff -r 000000000000 -r 7a96bd401351 tex/default-flags.png Binary file tex/default-flags.png has changed diff -r 000000000000 -r 7a96bd401351 tex/example1.png Binary file tex/example1.png has changed diff -r 000000000000 -r 7a96bd401351 texteditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/texteditor.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,921 @@ +#include "texteditor.h" + +#include <qcanvas.h> +#include <qstatusbar.h> +#include <qmessagebox.h> +#include <qaction.h> +#include <qapplication.h> +#include <qpainter.h> +#include <qprinter.h> +#include <qfile.h> +#include <qfiledialog.h> +#include <qtoolbar.h> +#include <qpopupmenu.h> +#include <qmenubar.h> +#include <qtextedit.h> +#include <qaccel.h> +#include <qtextstream.h> +#include <qpaintdevicemetrics.h> +#include <qsettings.h> +#include <qfontdialog.h> +#include <qmessagebox.h> +#include <qcolordialog.h> +#include <qregexp.h> +#include <qlineedit.h> +#include <qsimplerichtext.h> + +#include <iostream> +#include <stdlib.h> +#include <typeinfo> + +#include "icons/fileopen.xpm" +#include "icons/filesave.xpm" +#include "icons/fileprint.xpm" +#include "icons/editundo.xpm" +#include "icons/editredo.xpm" +#include "icons/editcopy.xpm" +#include "icons/editcut.xpm" +#include "icons/editpaste.xpm" +#include "icons/edittrash.xpm" +#include "icons/formatfixedfont.xpm" +#include "icons/formattextbold.xpm" +#include "icons/formattextitalic.xpm" +#include "icons/formattextunder.xpm" +#include "icons/formattextleft.xpm" +#include "icons/formattextcenter.xpm" +#include "icons/formattextright.xpm" +#include "icons/formattextjustify.xpm" + +extern QCanvas* actCanvas; +extern int statusbarTime; +extern QSettings settings; + +using namespace std; + + +/////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////// + +TextEditor::TextEditor() +{ + printer = new QPrinter( QPrinter::HighResolution ); + + // Editor + e = new QTextEdit( this, "editor" ); + e->setFocus(); + e->setTextFormat(RichText); // default + e->setTabStopWidth (20); // unit is pixel + e->setColor (black); + connect (e, SIGNAL( textChanged() ), this, SLOT( editorChanged() ) ); + setCentralWidget( e ); + statusBar()->message( "Ready", statusbarTime); + setCaption("VYM - Note Editor"); + + // Toolbars + setupFileActions(); + setupEditActions(); + setupFormatActions(); + setupSettingsActions(); + + // Various states + emptyPaper = QBrush(gray); + filledPaper = QBrush(white); + inactivePaper= QBrush(black); + setInactive(); + + // Load Settings + resize (settings.readNumEntry( "/vym/noteeditor/geometry/width", 450), + settings.readNumEntry( "/vym/noteeditor/geometry/height",600)); + move (settings.readNumEntry( "/vym/noteeditor/geometry/posX", 150), + settings.readNumEntry( "/vym/noteeditor/geometry/posY", 50)); + + if (settings.readEntry( "/vym/noteeditor/showWithMain","yes") =="yes") + setShowWithMain(true); + else + setShowWithMain(false); + + varFont.fromString( settings.readEntry + ("/vym/noteeditor/fonts/varFont", + "Nimbus Sans l,14,-1,5,48,0,0,0,0,0") + ); + fixedFont.fromString (settings.readEntry ( + "/vym/noteeditor/fonts/fixedFont", + "Courier,14,-1,5,48,0,0,0,1,0") + ); + QString s=settings.readEntry ("/vym/noteeditor/fonts/fonthintDefault","variable"); + if (s == "fixed") + { + actionSettingsFonthintDefault->setOn (true); + e->setCurrentFont (fixedFont); + } else + { + actionSettingsFonthintDefault->setOn (false); + e->setCurrentFont (varFont); + } +} + + +TextEditor::~TextEditor() +{ + if (printer) delete printer; + // Save Settings + settings.writeEntry( "/vym/noteeditor/geometry/width", width() ); + settings.writeEntry( "/vym/noteeditor/geometry/height", height() ); + settings.writeEntry( "/vym/noteeditor/geometry/posX", pos().x() ); + settings.writeEntry( "/vym/noteeditor/geometry/posY", pos().y() ); + + if (showWithMain()) + settings.writeEntry( "/vym/noteeditor/showWithMain","yes"); + else + settings.writeEntry( "/vym/noteeditor/showWithMain","no"); + + QString s; + if (actionSettingsFonthintDefault->isOn() ) + s="fixed"; + else + s="variable"; + settings.writeEntry( "/vym/noteeditor/fonts/fonthintDefault",s ); + settings.writeEntry ("/vym/noteeditor/fonts/varFont", + varFont.toString() ); + settings.writeEntry ("/vym/noteeditor/fonts/fixedFont", + fixedFont.toString() ); +} + +bool TextEditor::isEmpty() +{ + if (e->text().length()) + return false; + else + return true; +} + +void TextEditor::setShowWithMain(bool v) +{ + showwithmain=v; +} + +bool TextEditor::showWithMain() +{ + return showwithmain; +} + +void TextEditor::setFontHint (const QString &fh) +{ + if (fh=="fixed") + actionFormatUseFixedFont->setOn (true); + else + actionFormatUseFixedFont->setOn (false); +} + + +QString TextEditor::getFontHint() +{ + if (actionFormatUseFixedFont->isOn()) + return "fixed"; + else + return "var"; +} + +QString TextEditor::getFontHintDefault() +{ + if (actionSettingsFonthintDefault->isOn()) + return "fixed"; + else + return "var"; +} + +void TextEditor::setFilename(const QString &fn) +{ + if (state==filledEditor) + if (fn.isEmpty() ) + { + filename=""; + statusBar()->message( "No filename available for this note.", statusbarTime ); + } + else + { + filename=fn; + statusBar()->message( QString( "Current filename is %1" ).arg( filename ), statusbarTime ); + } +} + +QString TextEditor::getFilename() +{ + return filename; +} + +bool TextEditor::findText(const QString &t, const bool &cs) +{ + bool wo=false; // word matches + if (e->find (t, cs, wo, true, 0, 0 )) + return true; + else + return false; +} + +void TextEditor::setupFileActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "File Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&File" ), menu ); + + QAction *a; + a = new QAction( tr( "Import" ), QPixmap( fileopen_xpm), tr( "&Import..." ), CTRL + Key_O, this, "fileImport" ); + connect( a, SIGNAL( activated() ), this, SLOT( textLoad() ) ); + a->setEnabled(false); + a->addTo( tb ); + a->addTo( menu ); + actionFileLoad=a; + + menu->insertSeparator(); + a = new QAction( tr( "Export Note (HTML)" ), QPixmap( filesave_xpm ), tr( "&Export..." ), CTRL + Key_S, this, "fileSave" ); + connect( a, SIGNAL( activated() ), this, SLOT( textSave() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionFileSave=a; + + a = new QAction( tr( "Export Note As (HTML) " ), QPixmap(), tr( "Export &As... (HTML)" ), 0, this, "exportHTML" ); + connect( a, SIGNAL( activated() ), this, SLOT( textSaveAs() ) ); + a->addTo( menu ); + actionFileSaveAs=a; + + a = new QAction( tr( "Export Note As (ASCII) " ), QPixmap(), tr( "Export &As...(ASCII)" ), ALT + Key_X, this, "exportASCII" ); + connect( a, SIGNAL( activated() ), this, SLOT( textExportAsASCII() ) ); + a->addTo( menu ); + actionFileSaveAs=a; + + menu->insertSeparator(); + a = new QAction( tr( "Print Note" ), QPixmap( fileprint_xpm ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" ); + connect( a, SIGNAL( activated() ), this, SLOT( textPrint() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionFilePrint=a; +} + +void TextEditor::setupEditActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "Edit Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Edit" ), menu ); + + QAction *a; + a = new QAction( tr( "Undo" ), QPixmap(editundo_xpm), tr( "&Undo" ), CTRL + Key_Z, this, "undoEvent" ); + connect( a, SIGNAL( activated() ), e, SLOT( undo() ) ); + a->addTo( menu ); + a->addTo( tb); + actionEditUndo=a; + + a = new QAction( tr( "Redo" ), QPixmap( editredo_xpm ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); + connect( a, SIGNAL( activated() ), e, SLOT( redo() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionEditRedo=a; + + menu->insertSeparator(); + a = new QAction( tr( "Select and copy all" ), QPixmap(), tr( "Select and copy &all" ), CTRL + Key_A, this, "editcopyall" ); + connect( a, SIGNAL( activated() ), this, SLOT( editCopyAll() ) ); + a->addTo( menu ); + + menu->insertSeparator(); + a = new QAction( tr( "Copy" ), QPixmap( editcopy_xpm ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" ); + connect( a, SIGNAL( activated() ), e, SLOT( copy() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionEditCopy=a; + + a = new QAction( tr( "Cut" ), QPixmap( editcut_xpm ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" ); + connect( a, SIGNAL( activated() ), e, SLOT( cut() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionEditCut=a; + + a = new QAction( tr( "Paste" ), QPixmap( editpaste_xpm ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" ); + connect( a, SIGNAL( activated() ), e, SLOT( paste() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionEditPaste=a; + + a = new QAction( tr( "Delete all" ), QPixmap( edittrash_xpm ), tr( "&Delete All" ), 0, this, "editDeleteAll" ); + connect( a, SIGNAL( activated() ), e, SLOT( clear() ) ); + a->addTo( tb ); + a->addTo( menu ); + actionEditDeleteAll=a; + + a = new QAction( tr( "Convert paragraphs to linebreaks" ), QPixmap(), tr( "&Convert Paragraphs" ), ALT + Key_P, this, "editConvertPar" ); + connect( a, SIGNAL( activated() ), this, SLOT( textConvertPar() ) ); + a->addTo( menu ); + actionEditConvertPar=a; + + a = new QAction( tr( "Join all lines of a paragraph" ), QPixmap(), tr( "&Join lines" ), ALT + Key_J, this, "editJoinLines" ); + connect( a, SIGNAL( activated() ), this, SLOT( textJoinLines() ) ); + a->addTo( menu ); + actionEditJoinLines=a; +} + +void TextEditor::setupFormatActions() +{ + QToolBar *tb = new QToolBar( this ); + tb->setLabel( "Format Actions" ); + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Format" ), menu ); + + QAction *a; + + a = new QAction( tr( "Toggle font hint for the whole text" ), QPixmap(formatfixedfont_xpm), tr( "&Font hint" ), ALT + Key_I, this, "fontHint" ); + a->setToggleAction (true); + a->setOn (settings.readBoolEntry ("/vym/noteeditor/fonts/useFixedByDefault",false) ); + connect( a, SIGNAL( activated() ), this, SLOT( toggleFonthint() ) ); + a->addTo( menu ); + a->addTo( tb ); + actionFormatUseFixedFont=a; + + menu->insertSeparator(); + + comboFont = new QComboBox( true, tb ); + QFontDatabase db; + comboFont->insertStringList( db.families() ); + connect( comboFont, SIGNAL( activated( const QString & ) ), + this, SLOT( textFamily( const QString & ) ) ); + comboFont->lineEdit()->setText( QApplication::font().family() ); + + comboSize = new QComboBox( true, tb ); + QValueList<int> sizes = db.standardSizes(); + QValueList<int>::Iterator it = sizes.begin(); + for ( ; it != sizes.end(); ++it ) + comboSize->insertItem( QString::number( *it ) ); + connect( comboSize, SIGNAL( activated( const QString & ) ), + this, SLOT( textSize( const QString & ) ) ); + comboSize->lineEdit()->setText( QString::number( QApplication::font().pointSize() ) ); + + menu->insertSeparator(); + + QPixmap pix( 16, 16 ); + pix.fill( e->color()); + actionTextColor = new QAction( pix, tr( "&Color..." ), 0, this, "textColor" ); + connect( actionTextColor, SIGNAL( activated() ), this, SLOT( textColor() ) ); + actionTextColor->addTo( tb ); + actionTextColor->addTo( menu ); + + actionTextBold = new QAction( QPixmap (formattextbold_xpm), tr( "&Bold" ), CTRL + Key_B, this, "textBold" ); + connect( actionTextBold, SIGNAL( activated() ), this, SLOT( textBold() ) ); + actionTextBold->addTo( tb ); + actionTextBold->addTo( menu ); + actionTextBold->setToggleAction( true ); + actionTextItalic = new QAction( QPixmap(formattextitalic_xpm ), tr( "&Italic" ), CTRL + Key_I, this, "textItalic" ); + connect( actionTextItalic, SIGNAL( activated() ), this, SLOT( textItalic() ) ); + actionTextItalic->addTo( tb ); + actionTextItalic->addTo( menu ); + actionTextItalic->setToggleAction( true ); + actionTextUnderline = new QAction( QPixmap (formattextunder_xpm ), tr( "&Underline" ), CTRL + Key_U, this, "textUnderline" ); + connect( actionTextUnderline, SIGNAL( activated() ), this, SLOT( textUnderline() ) ); + actionTextUnderline->addTo( tb ); + actionTextUnderline->addTo( menu ); + actionTextUnderline->setToggleAction( true ); + menu->insertSeparator(); + + QActionGroup *grp = new QActionGroup( this ); + connect( grp, SIGNAL( selected( QAction* ) ), this, SLOT( textAlign( QAction* ) ) ); + + actionAlignLeft = new QAction( QPixmap (formattextleft_xpm ), tr( "&Left" ), CTRL + Key_L, grp, "textLeft" ); + actionAlignLeft->setToggleAction( true ); + actionAlignCenter = new QAction( QPixmap (formattextcenter_xpm ), tr( "C&enter" ), CTRL + Key_E, grp, "textCenter" ); + actionAlignCenter->setToggleAction( true ); + actionAlignRight = new QAction( QPixmap (formattextright_xpm ), tr( "&Right" ), CTRL + Key_R, grp, "textRight" ); + actionAlignRight->setToggleAction( true ); + actionAlignJustify = new QAction( QPixmap ( formattextjustify_xpm ), tr( "&Justify" ), CTRL + Key_J, grp, "textjustify" ); + actionAlignJustify->setToggleAction( true ); + + grp->addTo( tb ); + grp->addTo( menu ); + + connect( e, SIGNAL( currentFontChanged( const QFont & ) ), + this, SLOT( fontChanged( const QFont & ) ) ); + connect( e, SIGNAL( currentColorChanged( const QColor & ) ), + this, SLOT( colorChanged( const QColor & ) ) ); + connect( e, SIGNAL( currentAlignmentChanged( int ) ), + this, SLOT( alignmentChanged( int ) ) ); + +} + +void TextEditor::setupSettingsActions() +{ + QPopupMenu *menu = new QPopupMenu( this ); + menuBar()->insertItem( tr( "&Settings" ), menu ); + + QAction *a; + a = new QAction( tr( "Set fixed font" ), QPixmap(), tr( "Set &fixed font" ), 0, this, "setFixedFont" ); + connect( a, SIGNAL( activated() ), this, SLOT( setFixedFont() ) ); + a->addTo( menu ); + actionSettingsFixedFont=a; + + a = new QAction( tr( "Set variable font" ), QPixmap(), tr( "Set &variable font" ), 0, this, "setvariableFont" ); + connect( a, SIGNAL( activated() ), this, SLOT( setVarFont() ) ); + a->addTo( menu ); + actionSettingsVarFont=a; + + a = new QAction( tr( "Used fixed font by default" ), QPixmap(), tr( "&fixed font is default" ), 0, this, "fonthintDefault" ); + a->setToggleAction (true); + // set state later in constructor... + a->addTo( menu ); + actionSettingsFonthintDefault=a; +} + +void TextEditor::textLoad() +{ + if (state!=inactiveEditor) + { + if (e->length()) + { + QMessageBox mb( "VYM - Note Editor", + "Loading will overwrite the existing note", + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel, + 0 ); + mb.setButtonText( QMessageBox::Yes, "Load note" ); + switch( mb.exec() ) { + case QMessageBox::Cancel: + return; + break; + } + } + // Load note + QFileDialog *fd=new QFileDialog( this); + fd->addFilter ("ASCII texts (*.txt)"); + fd->addFilter ("VYM notes (*.html)"); + fd->show(); + QString fn; + if ( fd->exec() == QDialog::Accepted ) + fn = fd->selectedFile(); + + if ( !fn.isEmpty() ) + { + QFile f( fn ); + if ( !f.open( IO_ReadOnly ) ) + return; + + QTextStream ts( &f ); + setText( ts.read() ); + editorChanged(); + } + } +} + +void TextEditor::closeEvent( QCloseEvent* ce ) +{ + if ( !e->isModified() ) + { + ce->accept(); // TextEditor can be reopened with show() + return; + } +} + +QString TextEditor::getText() +{ + return e->text(); +} + +void TextEditor::editorChanged() +{ + // received, when QTextEdit::text() has changed + EditorState oldstate=state; + + if (isEmpty()) + state=emptyEditor; + else + state=filledEditor; + + if (state != oldstate) + { + if (state==emptyEditor) + e->setPaper (emptyPaper); + else + e->setPaper (filledPaper); + } + // SLOT is LinkableMapObj, which will update systemFlag + emit (textHasChanged() ); +} + + +void TextEditor::setText(QString t) +{ + if ( !QStyleSheet::mightBeRichText( t ) ) + t = QStyleSheet::convertFromPlainText( t, QStyleSheetItem::WhiteSpaceNormal ); + e->setReadOnly(false); + e->setText(t); + editorChanged(); //not called automagically + + enableActions(); +} + +void TextEditor::setInactive() +{ + setText(""); + state=inactiveEditor; + e->setPaper (inactivePaper); + e->setReadOnly (true); + + disableActions(); +} + +void TextEditor::editCopyAll() +{ + e->selectAll(); + e->copy(); +} + +void TextEditor::textSaveAs() +{ + QString fn = QFileDialog::getSaveFileName( QString::null, "VYM Note (HTML) (*.html);;All files (*)", + this,"export note dialog",tr("Export Note to single file") ); + + if ( !fn.isEmpty() ) + { + QFile file (fn); + if (file.exists()) + { + QMessageBox mb( "VYM", + tr("The file ") + fn + + tr(" exists already. " + "Do you want to overwrite it?"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::NoButton ); + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + switch( mb.exec() ) { + case QMessageBox::Yes: + // save + filename = fn; + textSave(); + return; + case QMessageBox::Cancel: + // do nothing + break; + } + } else + { + filename = fn; + textSave(); + return; + } + } + statusBar()->message(tr( "Couldn't export note ") + fn, statusbarTime ); +} + + +void TextEditor::textSave() +{ + if ( filename.isEmpty() ) + { + textSaveAs(); + return; + } + + QString text = e->text(); + QFile f( filename ); + if ( !f.open( IO_WriteOnly ) ) + { + statusBar()->message( QString("Could not write to %1").arg(filename), + statusbarTime ); + return; + } + + QTextStream t( &f ); + t << text; + f.close(); + + e->setModified( FALSE ); + + statusBar()->message( QString( "Note exported as %1" ).arg( filename ), statusbarTime ); +} + +void TextEditor::textConvertPar() +{ + // In X11 a copy&paste generates paragraphs, + // which is not always wanted + // This function replaces paragraphs by linebreaks. + int parFrom, parTo, indFrom, indTo; + e->getSelection (&parFrom,&indFrom,&parTo,&indTo); + QString t; + if (parFrom>-1) + t=e->selectedText(); + else + t=e->text(); + + QRegExp re("<p.*>"); + re.setMinimal(true); + t.replace (re,""); + t.replace ("</p>","<br />"); + if (parFrom>-1) + { + e->setCursorPosition (parFrom,indFrom); + e->cut(); + // Tried to simply insert the changed text with + // e->insert (t,(uint)(QTextEdit::RemoveSelected)); + // but then the html would be quoted. So I use the ugly + // way: insert a marker, replace it in whole text of QTextEdit + QString marker="R3PlAcEMeL4teR!"; + e->insert (marker); + e->setText (e->text().replace(marker,t)); + } else + e->setText(t); +} + +void TextEditor::textJoinLines() +{ + int parFrom, parTo, indFrom, indTo; + e->getSelection (&parFrom,&indFrom,&parTo,&indTo); + QString t; + if (parFrom>-1) + t=e->selectedText(); + else + t=e->text(); + // In addition to textConvertPar it is sometimes + // useful to join all lines of a paragraph + QRegExp re("</p>\n+<p>(?!</p>)"); + re.setMinimal(true); + t.replace (re," "); + + // Above we may have introduced new " " at beginning of a + // paragraph - remove it. + re.setPattern("<p> "); + t.replace (re,"<p>"); + if (parFrom>-1) + { + e->setCursorPosition (parFrom,indFrom); + e->cut(); + // Tried to simply insert the changed text with + // e->insert (t,(uint)(QTextEdit::RemoveSelected)); + // but then the html would be quoted. So I use the ugly + // way: insert a marker, replace it in whole text of QTextEdit + QString marker="R3PlAcEMeL4teR!"; + e->insert (marker); + e->setText (e->text().replace(marker,t)); + } else + e->setText(t); +} + +QString TextEditor::textConvertToASCII(const QString &t) +{ + QString r=t; + + // convert all "<br*>" to "\n" + QRegExp re("<br.*>"); + re.setMinimal(true); + r.replace (re,"\n"); + + // convert all "</p>" to "\n" + re.setPattern ("/p"); + r.replace (re,"\n"); + + // remove all remaining tags + re.setPattern ("<.*>"); + r.replace (re,""); + + // convert "&", "<" and ">" + re.setPattern (">"); + r.replace (re,">"); + re.setPattern ("<"); + r.replace (re,"<"); + re.setPattern ("&"); + r.replace (re,"&"); + return r; +} + +void TextEditor::textExportAsASCII() +{ + QString text = textConvertToASCII( e->text()); + QString fn = QFileDialog::getSaveFileName( QString::null, "VYM Note (ASCII) (*.txt);;All files (*)", + this,"export note dialog",tr("Export Note to single file (ASCII)") ); + int ret=-1; + + if ( !fn.isEmpty() ) + { + QFile file (fn); + if (file.exists()) + { + QMessageBox mb( "VYM", + tr("The file ") + fn + + tr(" exists already. " + "Do you want to overwrite it?"), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::Default, + QMessageBox::Cancel | QMessageBox::Escape, + QMessageBox::NoButton ); + mb.setButtonText( QMessageBox::Yes, tr("Overwrite") ); + mb.setButtonText( QMessageBox::No, tr("Cancel")); + ret=mb.exec(); + } + if (ret==QMessageBox::Cancel) + return; + + // save + if ( !file.open( IO_WriteOnly ) ) + statusBar()->message( QString("Could not write to %1").arg(filename), + statusbarTime ); + else + { + QTextStream t( &file ); + t << text; + file.close(); + + statusBar()->message( QString( "Note exported as %1" ).arg( fn ), statusbarTime ); + } + } +} + + +void TextEditor::textPrint() +{ + printer->setFullPage(TRUE); + if ( printer->setup( this ) ) + { + QPainter p( printer ); + // Check that there is a valid device to print to. + if ( !p.device() ) return; + QPaintDeviceMetrics metrics( p.device() ); + int dpiy = metrics.logicalDpiY(); + int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins + QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); + QFont font( e->currentFont() ); + font.setPointSize( 10 ); // we define 10pt to be a nice base size for printing + + QSimpleRichText richText( e->text(), font, + e->context(), + e->styleSheet(), + e->mimeSourceFactory(), + body.height() ); + richText.setWidth( &p, body.width() ); + QRect view( body ); + int page = 1; + do + { + richText.draw( &p, body.left(), body.top(), view, colorGroup() ); + view.moveBy( 0, body.height() ); + p.translate( 0 , -body.height() ); + p.setFont( font ); + p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), + view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); + if ( view.top() >= richText.height() ) + break; + printer->newPage(); + page++; + } while (TRUE); + } +} + +void TextEditor::textEditUndo() +{ +} + +void TextEditor::toggleFonthint() +{ + setUpdatesEnabled (false); + e->selectAll (true); + if (!actionFormatUseFixedFont->isOn() ) + e->setCurrentFont (varFont); + else + e->setCurrentFont (fixedFont); + e->selectAll (false); + setUpdatesEnabled (true); + repaint(); +} + +void TextEditor::setFixedFont() +{ + bool ok; + QFont font =QFontDialog::getFont( + &ok, fixedFont, this ); + if ( ok ) + // font is set to the font the user selected + fixedFont=font; +} + +void TextEditor::setVarFont() +{ + bool ok; + QFont font =QFontDialog::getFont( + &ok, varFont, this ); + if ( ok ) + // font is set to the font the user selected + varFont=font; +} + +void TextEditor::textBold() +{ + e->setBold( actionTextBold->isOn() ); +} + +void TextEditor::textUnderline() +{ + e->setUnderline( actionTextUnderline->isOn() ); +} + +void TextEditor::textItalic() +{ + e->setItalic( actionTextItalic->isOn() ); +} + +void TextEditor::textFamily( const QString &f ) +{ + e->setFamily( f ); +} + +void TextEditor::textSize( const QString &p ) +{ + e->setPointSize( p.toInt() ); +} + + +void TextEditor::textColor() +{ + QColor col = QColorDialog::getColor( e->color(), this ); + if ( !col.isValid() ) + return; + e->setColor( col ); + QPixmap pix( 16, 16 ); + pix.fill( black ); + actionTextColor->setIconSet( pix ); +} + +void TextEditor::textAlign( QAction *a ) +{ + if ( a == actionAlignLeft ) + e->setAlignment( AlignLeft ); + else if ( a == actionAlignCenter ) + e->setAlignment( AlignHCenter ); + else if ( a == actionAlignRight ) + e->setAlignment( AlignRight ); + else if ( a == actionAlignJustify ) + e->setAlignment( AlignJustify ); +} + +void TextEditor::fontChanged( const QFont &f ) +{ + comboFont->lineEdit()->setText( f.family() ); + comboSize->lineEdit()->setText( QString::number( f.pointSize() ) ); + actionTextBold->setOn( f.bold() ); + actionTextItalic->setOn( f.italic() ); + actionTextUnderline->setOn( f.underline() ); +} + +void TextEditor::colorChanged( const QColor &c ) +{ + QPixmap pix( 16, 16 ); + pix.fill( c ); + actionTextColor->setIconSet( pix ); +} + +void TextEditor::alignmentChanged( int a ) +{ + if ( ( a == AlignAuto ) || ( a & AlignLeft )) + actionAlignLeft->setOn( true ); + else if ( ( a & AlignHCenter ) ) + actionAlignCenter->setOn( true ); + else if ( ( a & AlignRight ) ) + actionAlignRight->setOn( true ); + else if ( ( a & AlignJustify ) ) + actionAlignJustify->setOn( true ); +} + + + +void TextEditor::enableActions() +{ + actionFileLoad->setEnabled(true); + actionFileSave->setEnabled(true); + actionFileSaveAs->setEnabled(true); + actionFilePrint->setEnabled(true); + actionEditUndo->setEnabled(true); + actionEditRedo->setEnabled(true); + actionEditCopy->setEnabled(true); + actionEditCut->setEnabled(true); + actionEditPaste->setEnabled(true); + actionEditDeleteAll->setEnabled(true); + actionEditConvertPar->setEnabled(true); + actionEditJoinLines->setEnabled(true); + actionFormatUseFixedFont->setEnabled(true); +} + +void TextEditor::disableActions() +{ + actionFileLoad->setEnabled(false); + actionFileSave->setEnabled(false); + actionFileSaveAs->setEnabled(false); + actionFilePrint->setEnabled(false); + actionEditUndo->setEnabled(false); + actionEditRedo->setEnabled(false); + actionEditCopy->setEnabled(false); + actionEditCut->setEnabled(false); + actionEditPaste->setEnabled(false); + actionEditDeleteAll->setEnabled(false); + actionEditConvertPar->setEnabled(false); + actionEditJoinLines->setEnabled(false); + actionFormatUseFixedFont->setEnabled(false); +} + + diff -r 000000000000 -r 7a96bd401351 texteditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/texteditor.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,123 @@ +#ifndef TEXTEDITOR_H +#define TEXTEDITOR_H + +#include <qmainwindow.h> +#include <qtextedit.h> +#include <qaction.h> +#include <qfontdatabase.h> +#include <qcombobox.h> + + +enum EditorState {inactiveEditor,emptyEditor,filledEditor}; + +class TextEditor : public QMainWindow { + Q_OBJECT +public: + TextEditor(); + ~TextEditor(); + + bool isEmpty(); + void setShowWithMain (bool); + bool showWithMain (); + void setFontHint(const QString&); + QString getFontHint(); + QString getFontHintDefault(); + void setFilename (const QString&); + QString getFilename (); + bool findText(const QString &, const bool &); // find Text + +protected: + void setupFileActions(); + void setupEditActions(); + void setupFormatActions(); + void setupSettingsActions(); + void closeEvent( QCloseEvent* ); + + +public: + QString getText(); + +public slots: + void editorChanged(); // received when text() changed + void setText(QString); // set Text (by MapEditor) + void setInactive(); // Nothing can be entered + void editCopyAll(); + +signals: + void textHasChanged(); + void fontFamilyHasChanged(); + void fontSizeHasChanged(); + +private slots: + void textLoad(); + void textSaveAs(); + void textSave(); + void textConvertPar(); + void textJoinLines(); + QString textConvertToASCII(const QString &); + void textExportAsASCII(); + void textPrint(); + void textEditUndo(); + void toggleFonthint(); + void setFixedFont(); + void setVarFont(); + void textBold(); + void textUnderline(); + void textItalic(); + void textFamily( const QString &f ); + void textSize( const QString &p ); + void textColor(); + void textAlign(QAction*); + void fontChanged( const QFont &f ); + void colorChanged( const QColor &c ); + void alignmentChanged( int a ); + void enableActions(); + void disableActions(); + +private: + QPrinter *printer; + QTextEdit *e; + QPoint lastPos; // save last position of window + QString filename; + + QBrush emptyPaper; // setting the background color + QBrush filledPaper; // depending on the state + QBrush inactivePaper; // depending on the state + EditorState state; + bool showwithmain; // same visibility as mainwindow? + + QFont varFont; + QFont fixedFont; + QComboBox + *comboFont, + *comboSize; + + QAction *actionFileLoad, + *actionFileSave, + *actionFileSaveAs, + *actionFilePrint, + *actionEditUndo, + *actionEditRedo, + *actionEditCopy, + *actionEditCut, + *actionEditPaste, + *actionEditDeleteAll, + *actionEditConvertPar, + *actionEditJoinLines, + *actionFormatUseFixedFont, + *actionSettingsVarFont, + *actionSettingsFixedFont, + *actionSettingsFonthintDefault, + *actionTextBold, + *actionTextUnderline, + *actionTextItalic, + *actionTextColor, + *actionAlignLeft, + *actionAlignCenter, + *actionAlignRight, + *actionAlignJustify; + + +}; + +#endif diff -r 000000000000 -r 7a96bd401351 version.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/version.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,7 @@ +#ifndef VERSION_H +#define VERSION_H + +#define __VYM_VERSION__ "1.6.0" +#define __BUILD_DATE__ "January 4, 2005" + +#endif diff -r 000000000000 -r 7a96bd401351 vym.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vym.pro Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,81 @@ +TARGET = vym +TRANSLATIONS += vym_de.ts + +TEMPLATE = app +LANGUAGE = C++ + +CONFIG += qt warn_on release + +DESTROOT = /usr + +target.path = $${DESTROOT}/bin +INSTALLS += target + +support.files = styles/ scripts/ icons/ +support.path = $${DESTROOT}/share/vym +INSTALLS += support + +doc.files = doc/* +doc.path = $${DESTROOT}/share/doc/packages/vym +INSTALLS += doc + +demo.files = demos/ +demo.path = $${DESTROOT}/share/vym +INSTALLS += demo + + +HEADERS += branchobj.h \ + exports.h \ + findwindow.h \ + flagobj.h \ + flagrowobj.h \ + floatimageobj.h \ + floatobj.h \ + frameobj.h \ + headingobj.h \ + imageobj.h \ + linkablemapobj.h \ + mainwindow.h \ + mapcenterobj.h \ + mapeditor.h \ + mapobj.h \ + misc.h \ + noteobj.h \ + ornamentedobj.h \ + process.h \ + selection.h \ + texteditor.h \ + version.h \ + xml.h \ + settings.h \ + options.h +SOURCES += branchobj.cpp \ + exports.cpp \ + findwindow.cpp \ + flagobj.cpp \ + flagrowobj.cpp \ + floatimageobj.cpp \ + floatobj.cpp \ + frameobj.cpp \ + headingobj.cpp \ + imageobj.cpp \ + linkablemapobj.cpp \ + main.cpp \ + mainwindow.cpp \ + mapcenterobj.cpp \ + mapeditor.cpp \ + mapobj.cpp \ + misc.cpp \ + noteobj.cpp \ + ornamentedobj.cpp \ + process.cpp \ + selection.cpp \ + texteditor.cpp \ + xml.cpp \ + settings.cpp \ + options.cpp +FORMS = exporthtmldialog.ui \ + exportxhtmldialog.ui \ + showtextdialog.ui \ + extrainfodialog.ui + diff -r 000000000000 -r 7a96bd401351 vym_de.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vym_de.ts Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,1574 @@ +<!DOCTYPE TS><TS> +<context> + <name>ExportHTMLDialog</name> + <message> + <source>Export HTML</source> + <translation>Exportiere HTML</translation> + </message> + <message> + <source>Directory:</source> + <translation>Verzeichnis:</translation> + </message> + <message> + <source>Browse</source> + <translation>Durchsuchen</translation> + </message> + <message> + <source>Options</source> + <translation>Optionen</translation> + </message> + <message> + <source>Include image of map</source> + <translation>Bild der Map erzeugen</translation> + </message> + <message> + <source>use WIKI style</source> + <translation>WIKI Stil verwenden</translation> + </message> + <message> + <source>show output</source> + <translation type="obsolete">Ausgabe der Scripte anzeigen</translation> + </message> + <message> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>VYM - Export HTML to directory</source> + <translation>VYM - Exportiere HTML in Verzeichnis</translation> + </message> + <message> + <source>Critcal export error</source> + <translation>Kritischer Fehler beim Exportieren</translation> + </message> + <message> + <source>create image only</source> + <translation>Nur Bild erzeugen</translation> + </message> + <message> + <source>use heading for URLs (instead of link target)</source> + <translation>Verwende Zweigbeschriftung für URL</translation> + </message> + <message> + <source>use image of earth to mark URLs in text</source> + <translation>Verwende Globus Symbol für URLs</translation> + </message> + <message> + <source>show output of external scripts</source> + <translation>Zeige Ausgabe der externen Skripte</translation> + </message> + <message> + <source>use default CSS file</source> + <translation>Default CSS Datei verwenden</translation> + </message> +</context> +<context> + <name>ExportXHTMLDialog</name> + <message> + <source>Export XHTML</source> + <translation>Exportiere XHTML</translation> + </message> + <message> + <source>Directory:</source> + <translation type="obsolete">Verzeichnis:</translation> + </message> + <message> + <source>Browse</source> + <translation>Durchsuchen</translation> + </message> + <message> + <source>Options</source> + <translation>Optionen</translation> + </message> + <message> + <source>Include image</source> + <translation>Bild erzeugen</translation> + </message> + <message> + <source>Include text</source> + <translation type="obsolete">Text erzeugen</translation> + </message> + <message> + <source>show output of external scripts</source> + <translation>Zeige Ausgabe der externen Skripte</translation> + </message> + <message> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>VYM - Export HTML to directory</source> + <translation>VYM - Exportiere HTML in Verzeichnis</translation> + </message> + <message> + <source>Critical Error</source> + <translation>Kritischer Fehler</translation> + </message> + <message> + <source>Couldn't start </source> + <translation>Konnte nicht starten</translation> + </message> + <message> + <source>didn't exit normally</source> + <translation>Exportiere XHTML</translation> + </message> + <message> + <source>Export to directory:</source> + <translation>Export Verzeichnis:</translation> + </message> + <message> + <source>Colored headings in text</source> + <translation>Farbige Headings im Text</translation> + </message> + <message> + <source>showWarnings e.g. if directory is not empty</source> + <translation>Warnung, falls Verzeichnis nicht leer ist</translation> + </message> + <message> + <source>Stylesheets</source> + <translation>Stylesheets</translation> + </message> + <message> + <source>CSS:</source> + <translation>CSS:</translation> + </message> + <message> + <source>XSL:</source> + <translation>XSL:</translation> + </message> + <message> + <source>VYM - Path to CSS file</source> + <translation>VYM - Pfad zu CSS Datei</translation> + </message> + <message> + <source>VYM - Path to XSL file</source> + <translation>VYM - Pfad zu XSL Datei</translation> + </message> + <message> + <source>Warning</source> + <translation>Warnung</translation> + </message> + <message> + <source> could not be opened!</source> + <translation>konnte nicht geöffnet werden!</translation> + </message> + <message> + <source>Save settings in map</source> + <translation>Einstellungen in map speichern</translation> + </message> + <message> + <source>Scripts</source> + <translation>Skripte</translation> + </message> + <message> + <source>Before export:</source> + <translation>Vor Export:</translation> + </message> + <message> + <source>After Export:</source> + <translation>Nach Export:</translation> + </message> + <message> + <source>The settings saved in the map would like to run scripts: + +</source> + <translation>Die in der Map gespeicherten Einstellungen wollen Skripte starten: + +</translation> + </message> + <message> + <source>Please check, if you really +want to allow this in your system!</source> + <translation>Bitte prüfen Sie, ob Sie das in Ihrem +System wirklich zulassen wollen!</translation> + </message> + <message> + <source>VYM - Path to pre export script</source> + <translation>VYM - Pfad für Prä-Export Skript</translation> + </message> + <message> + <source>VYM - Path to post export script</source> + <translation>VYM -Pfad für Post-Export Skript</translation> + </message> +</context> +<context> + <name>ExtraInfoDialog</name> + <message> + <source>VYM - Info</source> + <translation>VYM - Info</translation> + </message> + <message> + <source>Map:</source> + <translation>Map:</translation> + </message> + <message> + <source>Author:</source> + <translation>Author:</translation> + </message> + <message> + <source>Comment:</source> + <translation>Kommentar:</translation> + </message> + <message> + <source>Statistics:</source> + <translation>Statistik:</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Close</source> + <translation>Schliessen</translation> + </message> +</context> +<context> + <name>FindWindow</name> + <message> + <source>Clear</source> + <translation>Neuer Suchbegriff</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Find</source> + <translation>Suchen</translation> + </message> +</context> +<context> + <name>Main</name> + <message> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <source>New map</source> + <translation>Neu</translation> + </message> + <message> + <source>&New...</source> + <translation>&Neu...</translation> + </message> + <message> + <source>Open</source> + <translation>Öffnen</translation> + </message> + <message> + <source>&Open...</source> + <translation>&Öffnen...</translation> + </message> + <message> + <source>Save</source> + <translation>Speichern</translation> + </message> + <message> + <source>&Save...</source> + <translation>Speichern &unter...</translation> + </message> + <message> + <source>Save &As...</source> + <translation>Speichern &unter...</translation> + </message> + <message> + <source>Import directory structure (experimental)</source> + <translation>Importiere Verzeichnisstruktur (experimentelle Funktion)</translation> + </message> + <message> + <source>Import Dir</source> + <translation>Importiere Verzeichnis</translation> + </message> + <message> + <source>Export (png)</source> + <translation type="obsolete">Exportiere als png-Grafik</translation> + </message> + <message> + <source>&Export (png)</source> + <translation type="obsolete">&Export (png)</translation> + </message> + <message> + <source>Print</source> + <translation>Drucken</translation> + </message> + <message> + <source>&Print...</source> + <translation>&Drucken...</translation> + </message> + <message> + <source>Close Map</source> + <translation>Schließen</translation> + </message> + <message> + <source>&Close Map</source> + <translation>Schlie&ßen</translation> + </message> + <message> + <source>Exit VYM</source> + <translation>Beenden</translation> + </message> + <message> + <source>E&xit VYM</source> + <translation>B&eenden</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Bearbeiten</translation> + </message> + <message> + <source>Undo</source> + <translation>Rückgängig</translation> + </message> + <message> + <source>&Undo</source> + <translation>&Rückgängig</translation> + </message> + <message> + <source>Copy</source> + <translation>Kopieren</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Kopieren</translation> + </message> + <message> + <source>Cut</source> + <translation>Ausschneiden</translation> + </message> + <message> + <source>Cu&t</source> + <translation>&Ausschneiden</translation> + </message> + <message> + <source>Paste</source> + <translation>Einfügen</translation> + </message> + <message> + <source>&Paste</source> + <translation>Ein&fügen</translation> + </message> + <message> + <source>Move branch up</source> + <translation>Zweig nach oben bewegen</translation> + </message> + <message> + <source>Move up</source> + <translation>Zweig nach oben</translation> + </message> + <message> + <source>Move branch down</source> + <translation>Zweig nach unten bewegen</translation> + </message> + <message> + <source>Move down</source> + <translation>Zweig nach unten</translation> + </message> + <message> + <source>Scroll branch</source> + <translation>Zweig einrollen</translation> + </message> + <message> + <source>Unscroll all</source> + <translation>Alles aufrollen</translation> + </message> + <message> + <source>Unscroll all scrolled branches</source> + <translation>Alle eingerollten Zweige aufrollen</translation> + </message> + <message> + <source>Find</source> + <translation>Finde</translation> + </message> + <message> + <source>Open URL</source> + <translation>URL öffnen</translation> + </message> + <message> + <source>Edit URL</source> + <translation>URL ändern</translation> + </message> + <message> + <source>Use heading of selected branch as URL</source> + <translation>Beschriftung dieses Zweiges auch als URL verwenden</translation> + </message> + <message> + <source>Use heading for URL</source> + <translation>Beschriftung als URL übernehmen</translation> + </message> + <message> + <source>Jump to another vym map, if needed load it first</source> + <translation>Gehe zu einer weiteren Map. (Falls nötig wird die Map vorher geöffnet.)</translation> + </message> + <message> + <source>Jump to map</source> + <translation>Gehe zu einer weiteren Map.</translation> + </message> + <message> + <source>Edit link to another vym map</source> + <translation>Bearbeite Verbindung zu einer Map</translation> + </message> + <message> + <source>Edit map link</source> + <translation type="obsolete">Bearbeite Verbindung zu einer Map</translation> + </message> + <message> + <source>edit Heading</source> + <translation>Bearbeite Zweig-Überschrift</translation> + </message> + <message> + <source>Edit heading</source> + <translation>Bearbeite Zweig-Überschrift</translation> + </message> + <message> + <source>Delete Selection</source> + <translation>Entfernen</translation> + </message> + <message> + <source>Add a branch as child of selection</source> + <translation>Neuer Zweig </translation> + </message> + <message> + <source>Add branch as child</source> + <translation>Neuer Zweig </translation> + </message> + <message> + <source>Add a branch above selection</source> + <translation>Neuer Zweig - oben</translation> + </message> + <message> + <source>Add branch above</source> + <translation>Neuer Zweig - oben</translation> + </message> + <message> + <source>Add a branch below selection</source> + <translation>Neuer Zweig - unten</translation> + </message> + <message> + <source>Add branch below</source> + <translation>Neuer Zweig - unten</translation> + </message> + <message> + <source>Select upper branch</source> + <translation>Zweig oben</translation> + </message> + <message> + <source>Select lower branch</source> + <translation>Zweig unten</translation> + </message> + <message> + <source>Select left branch</source> + <translation>Zweig links</translation> + </message> + <message> + <source>Select right branch</source> + <translation>Zweig rechts</translation> + </message> + <message> + <source>Select child branch</source> + <translation>Kind-Zweig</translation> + </message> + <message> + <source>Select first branch</source> + <translation>Oberster Zweig</translation> + </message> + <message> + <source>Select last branch</source> + <translation>Unterster Zweig</translation> + </message> + <message> + <source>Add Image</source> + <translation>Lade Bild</translation> + </message> + <message> + <source>&Format</source> + <translation>&Format</translation> + </message> + <message> + <source>Set Color</source> + <translation>Wähle Farbe</translation> + </message> + <message> + <source>Set &Color</source> + <translation>Wähle &Farbe</translation> + </message> + <message> + <source>Pick color +Hint: You can pick a color from another branch and color using CTRL+Left Button</source> + <translation>Farb übernehmen +Tipp: Zum Kopieren einer Farbe kann man auch CTRL+linke Maustaste nehmen.</translation> + </message> + <message> + <source>Pic&k color</source> + <translation>Farbe &übernehmen</translation> + </message> + <message> + <source>Color branch</source> + <translation>Zweig färben</translation> + </message> + <message> + <source>Color &branch</source> + <translation>Zweig &färben</translation> + </message> + <message> + <source>Color Subtree</source> + <translation>Unterbaum färben</translation> + </message> + <message> + <source>Color sub&tree</source> + <translation>&Unterbaum färben</translation> + </message> + <message> + <source>Line</source> + <translation>Linie</translation> + </message> + <message> + <source>Linkstyle Line</source> + <translation>Linie</translation> + </message> + <message> + <source>Linkstyle Parabel</source> + <translation>Parabel</translation> + </message> + <message> + <source>PolyLine</source> + <translation>Dicke Linie</translation> + </message> + <message> + <source>Linkstyle Thick Line</source> + <translation>Dicke Linie</translation> + </message> + <message> + <source>PolyParabel</source> + <translation>Dicke Parabel</translation> + </message> + <message> + <source>Linkstyle Thick Parabel</source> + <translation>Dicke Parabel</translation> + </message> + <message> + <source>No Frame</source> + <translation>Kein Rahmen</translation> + </message> + <message> + <source>Rectangle</source> + <translation>Rechteck</translation> + </message> + <message> + <source>Use same color for links and headings</source> + <translation>Verbindungen haben Farbe der Beschriftungen</translation> + </message> + <message> + <source>&Use color of heading for link</source> + <translation>&Verbindungen haben Farbe der Beschriftungen</translation> + </message> + <message> + <source>Set Link Color</source> + <translation>Farbe der Verbindungen</translation> + </message> + <message> + <source>Set &Link Color</source> + <translation>&Farbe der Verbindungen</translation> + </message> + <message> + <source>Set Background Color</source> + <translation>Hintergrundfarbe</translation> + </message> + <message> + <source>Set &Background Color</source> + <translation>&Hintergrundfarbe</translation> + </message> + <message> + <source>&View</source> + <translation>&Ansicht</translation> + </message> + <message> + <source>Zoom reset</source> + <translation>Keine Vergrösserung</translation> + </message> + <message> + <source>reset Zoom</source> + <translation>Keine Vergrösserung</translation> + </message> + <message> + <source>Zoom in</source> + <translation>Vergrössern</translation> + </message> + <message> + <source>Zoom out</source> + <translation>Verkleinern</translation> + </message> + <message> + <source>Toggle Note Editor</source> + <translation>Zeige Notiz Editor</translation> + </message> + <message> + <source>&Next Window</source> + <translation>&Nächstes Fenster</translation> + </message> + <message> + <source>Next Window</source> + <translation>Nächstes Fenster</translation> + </message> + <message> + <source>&Previous Window</source> + <translation>&Vorheriges Fenster</translation> + </message> + <message> + <source>Previous Window</source> + <translation>Vorheriges Fenster</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Einstellungen</translation> + </message> + <message> + <source>Set application to open pdf files</source> + <translation>pdf-Dateien öffnen mit...</translation> + </message> + <message> + <source>Set application to open an URL</source> + <translation>URLs öffnen mit...</translation> + </message> + <message> + <source>Edit branch after adding it</source> + <translation>Zweig nach dem Einfügen neu beschriften</translation> + </message> + <message> + <source>Select branch after adding it</source> + <translation>Zweig nach dem Einfügen auswählen</translation> + </message> + <message> + <source>Select heading before editing</source> + <translation>Beschriftung vor dem editieren auswählen</translation> + </message> + <message> + <source>Select existing heading</source> + <translation>Beschriftung vor dem editieren auswählen</translation> + </message> + <message> + <source>Enable pasting into new branch</source> + <translation>Einfügen in neuen Zweig</translation> + </message> + <message> + <source>Enable Delete key for deleting branches</source> + <translation>Delete Taste zum Löschen von Zweigen verwenden</translation> + </message> + <message> + <source>Enable Delete key</source> + <translation>Delete Taste zum Löschen von Zweigen verwenden</translation> + </message> + <message> + <source>&Test</source> + <translation>&Test</translation> + </message> + <message> + <source>Test Flag</source> + <translation>Test Flag</translation> + </message> + <message> + <source>test flag</source> + <translation>test Flag</translation> + </message> + <message> + <source>Count Canvas Items</source> + <translation type="obsolete">Zähle Canvas Items</translation> + </message> + <message> + <source>Count Items</source> + <translation type="obsolete">Zähle Items</translation> + </message> + <message> + <source>Show Clipboard</source> + <translation>Zeige Zwischenablage</translation> + </message> + <message> + <source>Show clipboard</source> + <translation>Zeige Zwischenablage</translation> + </message> + <message> + <source>Export to dir</source> + <translation type="obsolete">Exportiere in Verzeichnis</translation> + </message> + <message> + <source>Export to directory</source> + <translation type="obsolete">Exportiere in Verzeichnis</translation> + </message> + <message> + <source>&Help</source> + <translation>&Hilfe</translation> + </message> + <message> + <source>Open VYM Documentation (pdf)</source> + <translation>VYM Handbuch (pdf)</translation> + </message> + <message> + <source>Open VYM Documentation (pdf) </source> + <translation>VYM Handbuch (pdf)</translation> + </message> + <message> + <source>Information about VYM</source> + <translation>Information über VYM</translation> + </message> + <message> + <source>About VYM</source> + <translation>Über VYM</translation> + </message> + <message> + <source>Information about QT toolkit</source> + <translation>Informationen zum QT Toolkit</translation> + </message> + <message> + <source>About QT</source> + <translation>Über QT</translation> + </message> + <message> + <source>Save image</source> + <translation>Speichere Bild</translation> + </message> + <message> + <source>The file </source> + <translation>Die Datei</translation> + </message> + <message> + <source> +exists already. Do you want to</source> + <translation>gibt es bereits. Wollen Sie sie</translation> + </message> + <message> + <source>Overwrite</source> + <translation>Überschreiben</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Couldn't save</source> + <translation>Diese Datei konnte nicht gespeichert werden:</translation> + </message> + <message> + <source>Saved </source> + <translation type="obsolete">Datei gespeichert: </translation> + </message> + <message> + <source>Couldn't save </source> + <translation type="obsolete">Diese Datei konnte nicht gespeichert werden: </translation> + </message> + <message> + <source>The map </source> + <translation>Die Map </translation> + </message> + <message> + <source> has been modified but not saved yet. Do you want to</source> + <translation>wurde verändert aber noch nicht gespeichert. Wollen Sie</translation> + </message> + <message> + <source>Save modified map before closing it</source> + <translation>Speichern und Map schliessen</translation> + </message> + <message> + <source>Discard changes</source> + <translation>Änderungen verwerfen</translation> + </message> + <message> + <source>This map is not saved yet. Do you want to</source> + <translation>Diese Map wurde noch nicht gespeichert. Wollen Sie </translation> + </message> + <message> + <source>Save map</source> + <translation>Speichern</translation> + </message> + <message> + <source>Critical Error</source> + <translation>Kritischer Fehler</translation> + </message> + <message> + <source>Enter path for pdf reader:</source> + <translation>Pfad für pdf-Anwendung:</translation> + </message> + <message> + <source>Enter path for application to open an URL:</source> + <translation>Pfad zum Öffnen von URLs:</translation> + </message> + <message> + <source>Save &As</source> + <translation>Speichern &unter...</translation> + </message> + <message> + <source>Open Recent</source> + <translation>Zuletzt geöffnete Dateien</translation> + </message> + <message> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <source>Export map as image</source> + <translation>als Bild</translation> + </message> + <message> + <source>Export as ASCII (still experimental)</source> + <translation>als ASCII Text (noch experimentell)</translation> + </message> + <message> + <source>Export (ASCII)</source> + <translation>als ASCII</translation> + </message> + <message> + <source>Edit Map Info</source> + <translation>Bearbeite Map Info</translation> + </message> + <message> + <source>Export XML</source> + <translation>Exportiere als XML</translation> + </message> + <message> + <source>Export HTML</source> + <translation>Exportiere als HTML</translation> + </message> + <message> + <source>The directory </source> + <translation>Das Verzeichnis</translation> + </message> + <message> + <source> is not empty. Do you risk to overwrite its contents?</source> + <translation>ist nicht leer.Riskieren sie es, das Verzeichnis zu überschreiben?</translation> + </message> + <message> + <source> + is already opened.Opening the same map in multiple editors may lead +to confusion when finishing working with vym.Do you want to</source> + <translation> +ist bereits geöffnet. Die gleiche Map mehrfach in verschiedenen Ansichten zu öffnen +kann beim Beenden von vym zu Problemen führen. Wollen Sie</translation> + </message> + <message> + <source>Open anyway</source> + <translation>Trotzdem öffnen</translation> + </message> + <message> + <source>Export XML to directory</source> + <translation>Exportiere XML in Verzeichnis</translation> + </message> + <message> + <source>Critcal error</source> + <translation>Kritischer Fehler</translation> + </message> + <message> + <source>Couldn't find the documentation +vym.pdf in various places.</source> + <translation>Konnte die Dokumentation vym.pdf +nirgends finden.</translation> + </message> + <message> + <source>Couldn't find a viewer to read vym.pdf. +Please use Settings-></source> + <translation>Konnte kein Programm zum Anzeigen von vym.pdf +finden. Bitte benutzen Sie Einstellungen-></translation> + </message> + <message> + <source>The map</source> + <translation>Die Map</translation> + </message> + <message> + <source> does not exist. + Do you want to create a new one?</source> + <translation>gibt es nicht +Wollen Sie eine neue anlegen?</translation> + </message> + <message> + <source>Create</source> + <translation>Anlegen</translation> + </message> + <message> + <source>Create URL to Bugzilla</source> + <translation>URL für Bugzilla anlegen</translation> + </message> + <message> + <source>Edit vym link</source> + <translation>vym Verknüpfung ändern</translation> + </message> + <message> + <source>Delete link to another vym map</source> + <translation>vym Verknüfung löschen</translation> + </message> + <message> + <source>Delete vym link</source> + <translation>vym Verknüpfung löschen</translation> + </message> + <message> + <source>Critical Load Error</source> + <translation>Kritischer Fehler beim Laden</translation> + </message> + <message> + <source>Couldn't start unzip to decompress data.</source> + <translation>Konnte unzip nicht starten, um Daten zu dekomprimieren.</translation> + </message> + <message> + <source>unzip didn't exit normally</source> + <translation>unzip wurde nicht richtig beendet</translation> + </message> + <message> + <source>Couldn't find a map (*.xml) in .vym archive. +</source> + <translation>Konnte keine map (*.xml) in .vym Datei finden. +</translation> + </message> + <message> + <source>Critical Save Error</source> + <translation>Kritischer Fehler beim Speichern</translation> + </message> + <message> + <source>Couldn't start zip to compress data.</source> + <translation>Konnte zip nicht starten, um Daten zu komprimieren.</translation> + </message> + <message> + <source>zip didn't exit normally</source> + <translation>zip wurde nicht richtig beendet</translation> + </message> + <message> + <source>Saving the map as </source> + <translation type="obsolete">Das Speichern der map als</translation> + </message> + <message> + <source> +will write it uncompressed. +This will also write the directories for images +and flags and thus may overwrite files in the given directory +Do you want to</source> + <translation type="obsolete"> +wird die map unkomprimiert schreiben. +Dabei werden Verzeichnisse für die Bilder und Flags erzeugt +und dabei evtl. andere Daten im Verzeichnis überschrieben</translation> + </message> + <message> + <source>Proceed</source> + <translation type="obsolete">Weiter</translation> + </message> + <message> + <source>Saved</source> + <translation>Gespeichert: </translation> + </message> + <message> + <source>VYM -Information:</source> + <translation>vym-Information:</translation> + </message> + <message> + <source>No matches found for </source> + <translation>Keine Treffer gefunden für</translation> + </message> + <message> + <source>Export XHTML</source> + <translation>Exportiere XHTML</translation> + </message> + <message> + <source> +did not use the compressed vym file format. +Writing it uncompressed will also write images +and flags and thus may overwrite files in the given directory + +Do you want to write the map</source> + <translation> +verwendet nicht das komprimierte vym Dateiformat. +Wenn die Map unkomprimiert geschrieben werden soll, +dann werden auch die Flags und Bilder im angegebenen +Verzeichnis geschrieben, was evtl. bestehende Daten +überschreiben kann + +Wollen Sie die Map beim Schreiben</translation> + </message> + <message> + <source>compressed (vym default)</source> + <translation>komprimieren (vym default)</translation> + </message> + <message> + <source>uncompressed</source> + <translation>unkomprimiert lassen</translation> + </message> + <message> + <source>Use for Export</source> + <translation>Benutze für Export</translation> + </message> + <message> + <source>Add map at selection</source> + <translation>Map an Auswahl anhängen</translation> + </message> + <message> + <source>Import (add)</source> + <translation>Import (hinzufügen)</translation> + </message> + <message> + <source>Replace selection with map</source> + <translation>Auswahl mit Map ersetzen</translation> + </message> + <message> + <source>Import (replace)</source> + <translation>Import (ersetzen)</translation> + </message> + <message> + <source>Save selction</source> + <translation>Auswahl speichern</translation> + </message> + <message> + <source>Save selection</source> + <translation>Auswahl speichern</translation> + </message> + <message> + <source>Load vym map</source> + <translation>Lade vym Map</translation> + </message> + <message> + <source>Import: Add vym map to selection</source> + <translation>Import: Füge Map zu Auswahl hinzu</translation> + </message> + <message> + <source>Import: Replace selection with vym map</source> + <translation>Import: Ersetze Auswahl mit Map</translation> + </message> + <message> + <source>Save Error</source> + <translation>Fehler beim Speichern</translation> + </message> + <message> + <source> +could not be removed before saving</source> + <translation> +konnte vor dem Speichern nicht gelöscht werden</translation> + </message> +</context> +<context> + <name>MapEditor</name> + <message> + <source>Note</source> + <translation>Notiz</translation> + </message> + <message> + <source>WWW Document (external)</source> + <translation>WWW Dokument (extern)</translation> + </message> + <message> + <source>Link to another vym map</source> + <translation>Verbindung zu einer anderen Map</translation> + </message> + <message> + <source>subtree is scrolled</source> + <translation>Teilbaum ist eingerollt</translation> + </message> + <message> + <source>subtree is temporary scrolled</source> + <translation>Teilbaum ist momentan ausgerollt</translation> + </message> + <message> + <source>Take care!</source> + <translation>Vorsicht!</translation> + </message> + <message> + <source>Really?</source> + <translation>Wirklich?</translation> + </message> + <message> + <source>ok!</source> + <translation>ok!</translation> + </message> + <message> + <source>Not ok!</source> + <translation>Nicht ok!</translation> + </message> + <message> + <source>This won't work!</source> + <translation>Das geht nicht!</translation> + </message> + <message> + <source>Good</source> + <translation>Gut</translation> + </message> + <message> + <source>Bad</source> + <translation>Schlecht</translation> + </message> + <message> + <source>Time critical</source> + <translation>Zeitkritisch</translation> + </message> + <message> + <source>Idea!</source> + <translation>Idee!</translation> + </message> + <message> + <source>Important</source> + <translation>Wichtig</translation> + </message> + <message> + <source>Unimportant</source> + <translation>Unwichtig</translation> + </message> + <message> + <source>I like this</source> + <translation>Finde ich gut</translation> + </message> + <message> + <source>I do not like this</source> + <translation>Finde ich schlecht</translation> + </message> + <message> + <source>I just love... </source> + <translation>Das liebe ich!</translation> + </message> + <message> + <source>Critical error while loading map</source> + <translation type="obsolete">Kritischer Fehler beim Laden der Map</translation> + </message> + <message> + <source>Critical Parse Error</source> + <translation>Kritischer Fehler beim Verarbeiten</translation> + </message> + <message> + <source>Warning: Old file format</source> + <translation type="obsolete">Warnung: Altes Dateiformat</translation> + </message> + <message> + <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> + <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> + </message> + <message> + <source>Critical Load Error</source> + <translation type="obsolete">Kritischer Fehler beim Laden</translation> + </message> + <message> + <source>Couldn't open map after uncompressing, I tried: +</source> + <translation type="obsolete">Konnte Map nach dem Entpacken nicht öffnen: +</translation> + </message> + <message> + <source>Critical Save Error</source> + <translation>Kritischer Fehler beim Speichern</translation> + </message> + <message> + <source>Couldn't write to </source> + <translation>Konnte nicht speichern:</translation> + </message> + <message> + <source>Critcal save error</source> + <translation>Kritischer Fehler beim Speichern</translation> + </message> + <message> + <source> doesn't exist</source> + <translation type="obsolete">gibt es nicht</translation> + </message> + <message> + <source>VYM - Export (ASCII)</source> + <translation>VYM - Export (ASCII)</translation> + </message> + <message> + <source>The file </source> + <translation>Die Datei</translation> + </message> + <message> + <source> exists already. Do you want to overwrite it?</source> + <translation>gibt es bereits. Wollen Sie sie</translation> + </message> + <message> + <source>Overwrite</source> + <translation>Überschreiben</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Critical Export Error </source> + <translation>Kritischer Fehler beim Exportieren</translation> + </message> + <message> + <source>Couldn't create directory </source> + <translation>Konnte Verzeichnis nicht anlegen</translation> + </message> + <message> + <source>VYM - Export to directory</source> + <translation type="obsolete">VYM - Export in Verzeichnis</translation> + </message> + <message> + <source>VYM - Export to directory (still experimental)</source> + <translation type="obsolete">VYM - Export in Verzeichnis</translation> + </message> + <message> + <source>The directory </source> + <translation type="obsolete">Das Verzeichnis</translation> + </message> + <message> + <source> is not empty. Do you risk to overwrite its contents?</source> + <translation type="obsolete">ist nicht leer.Riskieren sie es, das Verzeichnis zu überschreiben?</translation> + </message> + <message> + <source>Critical Export Error</source> + <translation>Kritischer Fehler beim Exportieren</translation> + </message> + <message> + <source>Critical Error</source> + <translation>Kritischer Fehler</translation> + </message> + <message> + <source> used for undo is gone. +I will create a new one, but at the moment no undo is available. +Maybe you want to reload your original data. + +Sorry for any inconveniences.</source> + <translation>Vielleicht wollen sie die Orginaldaten erneut laden +Sorry für die Unannehmlichkeiten.</translation> + </message> + <message> + <source>Enter URL:</source> + <translation>Neue URL:</translation> + </message> + <message> + <source>VYM - Link to another map</source> + <translation>VYM - Verbindung zu einer anderen Map</translation> + </message> + <message> + <source>vym map</source> + <translation>vym Map</translation> + </message> + <message> + <source>vym - load image</source> + <translation>VYM - Lade Bild</translation> + </message> + <message> + <source>Images</source> + <translation>Bilder</translation> + </message> + <message> + <source>vym - Load image</source> + <translation>vym - Lade Bild</translation> + </message> + <message> + <source>vym - save image as</source> + <translation>vym - Speichere Bild als</translation> + </message> + <message> + <source>vym - Save image as </source> + <translation>vym - Speichere Bild als</translation> + </message> + <message> + <source>Critical Import Error</source> + <translation>Kritischer Fehler beim Importieren</translation> + </message> + <message> + <source>Cannot find the directory</source> + <translation>Kann das Verzeichnis nicht finden</translation> + </message> + <message> + <source>VYM - Choose directory structur to import</source> + <translation>vym - Wähle Verzeichnisstruktur für Import</translation> + </message> + <message> + <source>Dangerous</source> + <translation>Gefährlich</translation> + </message> + <message> + <source>This will help</source> + <translation>Das könnte helfen</translation> + </message> + <message> + <source>New Map</source> + <translation>Neue Map</translation> + </message> + <message> + <source>Critical Parse Error by reading backupFile</source> + <translation>Kritischer Fehler beim Parsen +der Sicherungskopie</translation> + </message> + <message> + <source>MapEditor::exportXML couldn't open </source> + <translation>MapEditor::exportXML konnte nicht öffnen:</translation> + </message> +</context> +<context> + <name>QMessageBox</name> + <message> + <source>Critical Error</source> + <translation type="obsolete">Kritischer Fehler</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>new branch</source> + <translation type="obsolete">Neuer Zweig</translation> + </message> + <message> + <source>New Map</source> + <translation type="obsolete">Neue Map</translation> + </message> + <message> + <source>This is not an image.</source> + <translation>Das ist kein Bild.</translation> + </message> +</context> +<context> + <name>ShowTextDialog</name> + <message> + <source>VYM - Info</source> + <translation>VYM - Info</translation> + </message> + <message> + <source>Close</source> + <translation>Schliessen</translation> + </message> +</context> +<context> + <name>TextEditor</name> + <message> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <source>Import</source> + <translation>Importiere</translation> + </message> + <message> + <source>&Import...</source> + <translation>&Importiere</translation> + </message> + <message> + <source>Export Note</source> + <translation type="obsolete">Exportiere Notiz</translation> + </message> + <message> + <source>&Export...</source> + <translation>&Export</translation> + </message> + <message> + <source>Export Note As</source> + <translation type="obsolete">Exportiere Notiz unter...</translation> + </message> + <message> + <source>Export &As...</source> + <translation type="obsolete">Exportiere &unter...</translation> + </message> + <message> + <source>Print Note</source> + <translation>Drucke Notiz</translation> + </message> + <message> + <source>&Print...</source> + <translation>&Drucken</translation> + </message> + <message> + <source>&Edit</source> + <translation>&Bearbeiten</translation> + </message> + <message> + <source>Undo</source> + <translation>Rückgängig</translation> + </message> + <message> + <source>&Undo</source> + <translation>R&ückgängig</translation> + </message> + <message> + <source>Redo</source> + <translation>Wiederherstellen</translation> + </message> + <message> + <source>&Redo</source> + <translation>Wieder&herstellen</translation> + </message> + <message> + <source>Select and copy all</source> + <translation>Alles auswählen und kopieren</translation> + </message> + <message> + <source>Select and copy &all</source> + <translation>&Alles auswählen und kopieren</translation> + </message> + <message> + <source>Copy</source> + <translation>Kopieren</translation> + </message> + <message> + <source>&Copy</source> + <translation>&Kopieren</translation> + </message> + <message> + <source>Cut</source> + <translation>Ausschneiden</translation> + </message> + <message> + <source>Cu&t</source> + <translation>&Ausschneiden</translation> + </message> + <message> + <source>Paste</source> + <translation>Einfügen</translation> + </message> + <message> + <source>&Paste</source> + <translation>Ein&fügen</translation> + </message> + <message> + <source>Delete all</source> + <translation>Alles löschen</translation> + </message> + <message> + <source>&Delete All</source> + <translation>Alles &löschen</translation> + </message> + <message> + <source>&Format</source> + <translation>&Format</translation> + </message> + <message> + <source>Use fixed font</source> + <translation type="obsolete">Benutze fixe Zeichenbreite</translation> + </message> + <message> + <source>&Fixed font</source> + <translation type="obsolete">&fixe Zeichenbreite</translation> + </message> + <message> + <source>&Settings</source> + <translation>&Einstellungen</translation> + </message> + <message> + <source>Set fixed font</source> + <translation>Wähle Zeichensatz mit fixer Breite</translation> + </message> + <message> + <source>Set &fixed font</source> + <translation>Wähle Zeichensatz mit f&ixer Breite</translation> + </message> + <message> + <source>Set variable font</source> + <translation>Wähle Zeichensatz mit variabler Breite</translation> + </message> + <message> + <source>Set &variable font</source> + <translation>Wähle Zeichensatz mit v&ariabler Breite</translation> + </message> + <message> + <source>Used fixed font by default</source> + <translation>Verwende fixen Zeichensatz per default</translation> + </message> + <message> + <source>&fixed font is default</source> + <translation>Verwende fixen Zeichensatz p&er default</translation> + </message> + <message> + <source>Export Note (HTML)</source> + <translation>Exportiere Notiz (HTML)</translation> + </message> + <message> + <source>Export Note As (HTML) </source> + <translation>Exportiere Notiz als (HTML)</translation> + </message> + <message> + <source>Export &As... (HTML)</source> + <translation>Exportiere Notiz &als... (HTML)</translation> + </message> + <message> + <source>Export Note As (ASCII) </source> + <translation>Exportiere Notiz als (ASCII)</translation> + </message> + <message> + <source>Export &As...(ASCII)</source> + <translation>Exportiere a&ls (ASCII)</translation> + </message> + <message> + <source>Use fixed width font for the whole text</source> + <translation type="obsolete">Feste Zeichenbreite für den Text verwenden</translation> + </message> + <message> + <source>&Color...</source> + <translation>&Farbe...</translation> + </message> + <message> + <source>&Bold</source> + <translation>F&ett</translation> + </message> + <message> + <source>&Italic</source> + <translation>K&ursiv</translation> + </message> + <message> + <source>&Underline</source> + <translation>&Unterstrichen</translation> + </message> + <message> + <source>&Left</source> + <translation>&Linksbündig</translation> + </message> + <message> + <source>C&enter</source> + <translation>&Zentriert</translation> + </message> + <message> + <source>&Right</source> + <translation>&Rechtsbündig</translation> + </message> + <message> + <source>&Justify</source> + <translation>&Blocksatz</translation> + </message> + <message> + <source>Export Note to single file</source> + <translation>Notiz in eine einzelne Datei exportieren</translation> + </message> + <message> + <source>The file </source> + <translation>Die Datei</translation> + </message> + <message> + <source> exists already. Do you want to overwrite it?</source> + <translation>gibt es bereits. Wollen Sie sie</translation> + </message> + <message> + <source>Overwrite</source> + <translation>Überschreiben</translation> + </message> + <message> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <source>Couldn't export note </source> + <translation>Konnte Notiz nicht exportieren</translation> + </message> + <message> + <source>Export Note to single file (ASCII)</source> + <translation>Notiz als ASCII in eine einzelne Datei ausgeben</translation> + </message> + <message> + <source>Convert paragraphs to linebreaks</source> + <translation>Absätze in Zeilenbrüche umwandeln</translation> + </message> + <message> + <source>&Convert Paragraphs</source> + <translation>&Absätze umwandeln</translation> + </message> + <message> + <source>Join all lines of a paragraph</source> + <translation>Alle Zeilenumbrüche eines Absatzes zu vereinen</translation> + </message> + <message> + <source>&Join lines</source> + <translation>&Zeilen vereinen</translation> + </message> + <message> + <source>Toggle font hint for the whole text</source> + <translation>Zeichensatz für gesamten Text umschalten</translation> + </message> + <message> + <source>&Font hint</source> + <translation>Zeichensatz &umschalten</translation> + </message> +</context> +</TS> diff -r 000000000000 -r 7a96bd401351 xml.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml.cpp Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,519 @@ +#include "xml.h" + +#include <qmessagebox.h> +#include <qcolor.h> +#include <qstylesheet.h> +#include <iostream> + +#include "misc.h" +#include "settings.h" + +#include "version.h" + +static BranchObj *lastBranch; +static FloatObj *lastFloat; + +extern Settings settings; + +mapBuilderHandler::mapBuilderHandler() {} + +mapBuilderHandler::~mapBuilderHandler() {} + +QString mapBuilderHandler::errorProtocol() { return errorProt; } + +bool mapBuilderHandler::startDocument() +{ + errorProt = ""; + state = StateInit; + laststate = StateInit; + branchDepth=0; + htmldata=""; + isVymPart=false; + return true; +} + + +QString mapBuilderHandler::parseHREF(QString href) +{ + QString type=href.section(":",0,0); + QString path=href.section(":",1,1); + if (!tmpDir.endsWith("/")) + return tmpDir + "/" + path; + else + return tmpDir + path; +} + +bool mapBuilderHandler::startElement ( const QString&, const QString&, + const QString& eName, const QXmlAttributes& atts ) +{ + QColor col; +// cout << "startElement <"<<eName<<"> state="<<state <<" laststate="<<laststate<<endl; + if ( state == StateInit && (eName == "vymmap") ) + { + state = StateMap; + if (!atts.value( "version").isEmpty() ) + { + mc->setVersion(atts.value( "version" )); + if (!mc->checkVersion()) + QMessageBox::warning( 0, "Warning: Version Problem" , + "<h3>Map is newer than VYM</h3>" + "<p>The map you are just trying to load was " + "saved using vym " +atts.value("version")+". " + "The version of this vym is " __VYM_VERSION__ + ". If you run into problems after pressing " + "the ok-button below, updating vym should help."); + + } + if (loadMode==NewMap) + { + if (!atts.value( "author").isEmpty() ) + { + mc->setAuthor(atts.value( "author" ) ); + } + if (!atts.value( "comment").isEmpty() ) + { + mc->setComment (atts.value( "comment" ) ); + } + if (!atts.value( "backgroundColor").isEmpty() ) + { + col.setNamedColor(atts.value("backgroundColor")); + mc->getCanvas()->setBackgroundColor(col); + } + if (!atts.value( "linkColorHint").isEmpty() ) + { + if (atts.value("linkColorHint")=="HeadingColor") + me->setLinkColorHint(HeadingColor); + else + me->setLinkColorHint(DefaultColor); + } + if (!atts.value( "linkStyle").isEmpty() ) + { + QString s=atts.value("linkStyle"); + if (s=="StyleLine") + me->setLinkStyle(StyleLine); + else + if (s=="StyleParabel") + me->setLinkStyle(StyleParabel); + else + if (s=="StylePolyLine") + me->setLinkStyle(StylePolyLine); + else + me->setLinkStyle(StylePolyParabel); + } + if (!atts.value( "linkColor").isEmpty() ) + { + col.setNamedColor(atts.value("linkColor")); + me->setLinkColor(col); + } + } + } else if ( eName == "select" && state == StateMap ) + { + state=StateMapSelect; + } else if ( eName == "setting" && state == StateMap ) + { + state=StateMapSetting; + if (loadMode==NewMap) + readSettingAttr (atts); + } else if ( eName == "mapcenter" && state == StateMap ) + { + state=StateMapCenter; + if (loadMode==NewMap) + { + // Really use the found mapcenter as MCO in a new map + lastBranch=mc; // avoid empty pointer + } else + { + // Treat the found mapcenter as a branch + // in an existing map + LinkableMapObj* lmo=me->getSelection(); + if (lmo && (typeid(*lmo) == typeid(BranchObj) ) + || (typeid(*lmo) == typeid(MapCenterObj) ) ) + { + lastBranch=(BranchObj*)(lmo); + if (loadMode==ImportAdd) + { + lastBranch->addBranch(); + lastBranch=lastBranch->getLastBranch(); + } else + lastBranch->clear(); + } else + return false; + } + readBranchAttr (atts); + } else if ( (eName == "standardflag" ||eName == "standardFlag") && state == StateMapCenter) + { + state=StateMapCenterStandardFlag; + } else if ( eName == "heading" && state == StateMapCenter) + { + state=StateMapCenterHeading; + if (!atts.value( "textColor").isEmpty() ) + { + col.setNamedColor(atts.value("textColor")); + lastBranch->setColor(col ,false ); + } + } else if ( eName == "note" && state == StateMapCenter) + { // only for backward compatibility (<1.4.6). Use htmlnote now. + state=StateMapCenterNote; + if (!readNoteAttr (atts) ) return false; + } else if ( eName == "htmlnote" && state == StateMapCenter) + { + laststate=state; + state=StateHtmlNote; + } else if ( eName == "floatimage" && state == StateMapCenter ) + { + state=StateMapCenterFloatImage; + lastBranch->addFloatImage(); + lastFloat=lastBranch->getLastFloatImage(); + if (!readFloatImageAttr(atts)) return false; + } else if ( eName == "branch" && state == StateMap) + { + // This is used in vymparts, which have no mapcenter! + isVymPart=true; + state=StateBranch; + LinkableMapObj* lmo=me->getSelection(); + if (lmo && (typeid(*lmo) == typeid(BranchObj) ) + || (typeid(*lmo) == typeid(MapCenterObj) ) ) + { + lastBranch=(BranchObj*)(lmo); + if (loadMode==ImportAdd) + { + lastBranch->addBranch(); + lastBranch=lastBranch->getLastBranch(); + } else + lastBranch->clear(); + } else + return false; + branchDepth=1; + readBranchAttr (atts); + } else if ( eName == "branch" && state == StateMapCenter) + { + state=StateBranch; + branchDepth=1; + lastBranch->addBranch(); + lastBranch=lastBranch->getLastBranch(); + readBranchAttr (atts); + } else if ( (eName=="standardflag" ||eName == "standardFlag") && state == StateBranch) + { + state=StateBranchStandardFlag; + } else if ( eName == "heading" && state == StateBranch) + { + state=StateBranchHeading; + if (!atts.value( "textColor").isEmpty() ) + { + col.setNamedColor(atts.value("textColor")); + lastBranch->setColor(col ,false ); + } + } else if ( eName == "note" && state == StateBranch) + { + state=StateBranchNote; + if (!readNoteAttr (atts) ) return false; + } else if ( eName == "htmlnote" && state == StateBranch) + { + laststate=state; + state=StateHtmlNote; + no.clear(); + if (!atts.value( "fonthint").isEmpty() ) + no.setFontHint(atts.value ("fonthint") ); + } else if ( eName == "floatimage" && state == StateBranch ) + { + state=StateBranchFloatImage; + lastBranch->addFloatImage(); + lastFloat=lastBranch->getLastFloatImage(); + if (!readFloatImageAttr(atts)) return false; + } else if ( eName == "branch" && state == StateBranch ) + { + lastBranch->addBranch(); + lastBranch=lastBranch->getLastBranch(); + branchDepth++; + readBranchAttr (atts); + } else if ( eName == "html" && state == StateHtmlNote ) + { + state=StateHtml; + htmldata="<"+eName; + readHtmlAttr(atts); + htmldata+=">"; + } else if ( state == StateHtml ) + { + // accept all while in html mode, + htmldata+="<"+eName; + readHtmlAttr(atts); + htmldata+=">"; + } else + return false; // Error + return true; +} + +bool mapBuilderHandler::endElement ( const QString&, const QString&, const QString &eName) +{ +// cout << "endElement </"<<eName<<"> state="<<state <<" laststate="<<laststate<<endl; + switch ( state ) + { + case StateMapSelect: state=StateMap; return true; + case StateMapSetting: state=StateMap; return true; + case StateMapCenter: state=StateMap; return true; + case StateMapCenterStandardFlag: state=StateMapCenter; return true; + case StateMapCenterHeading: state=StateMapCenter; return true; + case StateMapCenterNote: state=StateMapCenter; return true; + case StateMapCenterFloatImage: state=StateMapCenter; return true; + case StateBranch: + if (branchDepth>1) + { + branchDepth--; + state=StateBranch; + } else + { + branchDepth=0; + if (isVymPart) + state=StateMap; + else + state=StateMapCenter; + } + lastBranch=(BranchObj*)(lastBranch->getParObj()); + return true; + case StateBranchStandardFlag: state=StateBranch; return true; + case StateBranchHeading: state=StateBranch; return true; + case StateBranchNote: state=StateBranch; return true; + case StateBranchFloatImage: state=StateBranch; return true; + case StateHtmlNote: state=laststate; return true; + case StateHtml: + htmldata+="</"+eName+">"; + if (eName=="html") + { + state=StateHtmlNote; + htmldata.replace ("<br></br>","<br />"); + no.setNote (htmldata); + lastBranch->setNote (no); + return true; + } else + { + return true; + } + case StateMap: state=StateInit; return true; + default : + // even for HTML includes, this should never be reached + return false; + } +} + +bool mapBuilderHandler::characters ( const QString& ch) +{ + //cout << "characters \""<<ch<<"\" state="<<state <<" laststate="<<laststate<<endl; + + QString ch_org=quotemeta (ch); + QString ch_simplified=ch.simplifyWhiteSpace(); + if ( ch_simplified.isEmpty() ) return true; + + switch ( state ) + { + case StateInit: break; + case StateMap: break; + case StateMapSelect: + me->select(ch_simplified); + break; + case StateMapSetting:break; + case StateMapCenter: break; + case StateMapCenterStandardFlag: + lastBranch->activateStandardFlag(ch_simplified); + break; + case StateMapCenterHeading: + lastBranch->setHeading(ch_simplified); + break; + case StateMapCenterNote: + lastBranch->setNote(ch_simplified); + break; + case StateBranch: break; + case StateBranchStandardFlag: + lastBranch->activateStandardFlag(ch_simplified); + break; + case StateBranchHeading: + lastBranch->setHeading(ch_simplified); + break; + case StateBranchNote: + lastBranch->setNote(ch_simplified); + break; + case StateBranchFloatImage: break; + case StateHtmlNote: break; + case StateHtml: + htmldata+=ch_org; + break; + default: + return false; + } + return true; +} + +QString mapBuilderHandler::errorString() +{ + return "the document is not in the VYM file format"; +} + +bool mapBuilderHandler::fatalError( const QXmlParseException& exception ) +{ + errorProt += QString( "fatal parsing error: %1 in line %2, column %3\n") + .arg( exception.message() ) + .arg( exception.lineNumber() ) + .arg( exception.columnNumber() ); + + return QXmlDefaultHandler::fatalError( exception ); +} + +void mapBuilderHandler::setMapEditor (MapEditor* e) +{ + me=e; + mc=me->getMapCenter(); +} + +void mapBuilderHandler::setTmpDir (QString tp) +{ + tmpDir=tp; +} + +void mapBuilderHandler::setLoadMode (const LoadMode &lm) +{ + loadMode=lm; +} + +bool mapBuilderHandler::readBranchAttr (const QXmlAttributes& a) +{ + bool okx,oky; + int x,y; + if (!a.value( "absPosX").isEmpty() && loadMode==NewMap && branchDepth<2) + { + if (!a.value( "absPosY").isEmpty() ) + { + x=a.value("absPosX").toInt (&okx, 10); + y=a.value("absPosY").toInt (&oky, 10); + if (okx && oky) + lastBranch->move(x,y); + else + return false; // Couldn't read absPos + } + } + if (!a.value( "scrolled").isEmpty() ) + lastBranch->toggleScroll(); + if (!a.value( "url").isEmpty() ) + lastBranch->setURL (a.value ("url")); + if (!a.value( "vymLink").isEmpty() ) + lastBranch->setVymLink (a.value ("vymLink")); + if (!a.value( "frameType").isEmpty() ) + lastBranch->setFrameType (a.value("frameType")); + return true; +} + +bool mapBuilderHandler::readNoteAttr (const QXmlAttributes& a) +{ // only for backward compatibility (<1.4.6). Use htmlnote now. + no.clear(); + QString fn; + if (!a.value( "href").isEmpty() ) + { + // Load note + fn=parseHREF(a.value ("href") ); + QFile file (fn); + QString s; // Reading a note + + if ( !file.open( IO_ReadOnly) ) + { + qWarning ("mapBuilderHandler::readNoteAttr: Couldn't load "+fn); + return false; + } + QTextStream stream( &file ); + QString lines; + while ( !stream.eof() ) { + lines += stream.readLine()+"\n"; + } + file.close(); + // Convert to richtext + if ( !QStyleSheet::mightBeRichText( lines ) ) + { + // Here we are workarounding the QT conversion method: + // convertFromPlainText does not generate valid xml, needed + // for the parser, but just <p> and <br> without closing tags. + // So we have to add those by ourselves + //lines=quotemeta (lines); + lines = QStyleSheet::convertFromPlainText( lines, QStyleSheetItem::WhiteSpaceNormal ); + lines.replace ("<br>","<br />"); + } + + lines ="<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body>"+lines + "</p></body></html>"; + no.setNote (lines); + } + if (!a.value( "fonthint").isEmpty() ) + no.setFontHint(a.value ("fonthint") ); + if (state == StateMapCenterNote) + mc->setNote(no); + else + lastBranch->setNote(no); + return true; +} + +bool mapBuilderHandler::readFloatImageAttr (const QXmlAttributes& a) +{ + if (!a.value( "useOrientation").isEmpty() ) + { + if (a.value ("useOrientation") =="true") + lastFloat->setUseOrientation (true); + else + lastFloat->setUseOrientation (false); + } + if (!a.value( "href").isEmpty() ) + { + // Load FloatImage + if (!lastFloat->load (parseHREF(a.value ("href") ) )) + { + QMessageBox::warning( 0, "Warning: " , + "Couldn't load float image\n"+parseHREF(a.value ("href") )); + lastBranch->removeFloatImage(((FloatImageObj*)(lastFloat))); + lastFloat=NULL; + return true; + } + + } + if (!a.value( "floatExport").isEmpty() ) + { + if (a.value ("floatExpofrt") =="true") + lastFloat->setFloatExport (true); + else + lastFloat->setFloatExport (false); + } + if (!a.value( "zPlane").isEmpty() ) + lastFloat->setZ (a.value("zPlane").toInt ()); + int x,y; + bool okx,oky; + if (!a.value( "relPosX").isEmpty() ) + { + if (!a.value( "relPosY").isEmpty() ) + { + // read relPos + x=a.value("relPosX").toInt (&okx, 10); + y=a.value("relPosY").toInt (&oky, 10); + if (okx && oky) + lastFloat->setRelPos (QPoint (x,y) ); + else + // Couldn't read relPos + return false; + } + } + return true; +} + +bool mapBuilderHandler::readHtmlAttr (const QXmlAttributes& a) +{ + for (int i=1; i<=a.count(); i++) + htmldata+=" "+a.localName(i-1)+"=\""+a.value(i-1)+"\""; + return true; +} + +bool mapBuilderHandler::readSettingAttr (const QXmlAttributes& a) +{ + if (!a.value( "key").isEmpty() ) + { + if (!a.value( "value").isEmpty() ) + settings.setLocalEntry (me->getDestPath(), a.value ("key"), a.value ("value")); + else + return false; + + } else + return false; + + return true; +} diff -r 000000000000 -r 7a96bd401351 xml.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml.h Sun Jan 30 12:58:47 2005 +0000 @@ -0,0 +1,62 @@ +#ifndef XLM_H +#define XLM_H + + +#include <qstring.h> +#include <qxml.h> + +#include "mapcenterobj.h" +#include "mapeditor.h" + + +class mapBuilderHandler : public QXmlDefaultHandler +{ +public: + mapBuilderHandler(); + ~mapBuilderHandler(); + QString errorProtocol(); + bool startDocument(); + QString mapBuilderHandler::parseHREF(QString); + bool startElement ( const QString&, const QString&, + const QString& eName, const QXmlAttributes& atts ); + bool endElement ( const QString&, const QString&, const QString& ); + bool characters ( const QString&); + QString errorString(); + bool fatalError( const QXmlParseException&); + void setMapEditor (MapEditor*); + void setTmpDir (QString); + void setLoadMode (const LoadMode &); + bool readBranchAttr (const QXmlAttributes&); + bool readNoteAttr (const QXmlAttributes&); + bool readFloatImageAttr (const QXmlAttributes&); + bool readHtmlAttr (const QXmlAttributes&); + bool readSettingAttr (const QXmlAttributes&); + +private: + QString errorProt; + enum State + { + StateInit, StateMap, StateMapSelect, + StateMapSetting, + StateMapCenter, StateMapCenterStandardFlag, + StateMapCenterHeading, StateMapCenterNote, + StateMapCenterFloatImage, + + StateBranch, StateBranchStandardFlag, + StateBranchHeading, StateBranchNote, + StateBranchFloatImage, + StateHtmlNote, StateHtml + }; + + + LoadMode loadMode; + bool isVymPart; + State state; + State laststate; + QString htmldata; + int branchDepth; + NoteObj no; + MapCenterObj* mc; + MapEditor* me; QString tmpDir; +}; +#endif