summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Gardner <je_fro@gentoo.org>2007-08-10 17:38:15 +0000
committerJeffrey Gardner <je_fro@gentoo.org>2007-08-10 17:38:15 +0000
commitebc415a7f39df5864918e7f3e4e91236bb364763 (patch)
tree0bdf7413f52f4afe6b8e035cf517550162b87476
parentremoving for now (diff)
downloadje_fro-ebc415a7f39df5864918e7f3e4e91236bb364763.tar.gz
je_fro-ebc415a7f39df5864918e7f3e4e91236bb364763.tar.bz2
je_fro-ebc415a7f39df5864918e7f3e4e91236bb364763.zip
Adding the crippled 2.0.5 edition, even though it's teh suck.
svn path=/; revision=30
-rw-r--r--sci-misc/qcad/Manifest25
-rw-r--r--sci-misc/qcad/files/digest-qcad-2.0.5.06
-rw-r--r--sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-gentoo.patch60
-rw-r--r--sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-intptr.patch24
-rw-r--r--sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-manual.patch4101
-rw-r--r--sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-pedantic.patch10
-rw-r--r--sci-misc/qcad/qcad-2.0.5.0.ebuild97
7 files changed, 4323 insertions, 0 deletions
diff --git a/sci-misc/qcad/Manifest b/sci-misc/qcad/Manifest
new file mode 100644
index 0000000..514973e
--- /dev/null
+++ b/sci-misc/qcad/Manifest
@@ -0,0 +1,25 @@
+AUX qcad-2.0.5.0-1-community.src-gentoo.patch 2176 RMD160 3fb1fae037d07240c1ea235a7b9614eb7f3e6477 SHA1 2cb96d6955c15632fdea58d1b56aa1add200794d SHA256 e41fbd37944b8903545a39e48ac28b181ca45876cbb40214e77574df2909378c
+MD5 c2c294f19894f4c898f28739d36fd182 files/qcad-2.0.5.0-1-community.src-gentoo.patch 2176
+RMD160 3fb1fae037d07240c1ea235a7b9614eb7f3e6477 files/qcad-2.0.5.0-1-community.src-gentoo.patch 2176
+SHA256 e41fbd37944b8903545a39e48ac28b181ca45876cbb40214e77574df2909378c files/qcad-2.0.5.0-1-community.src-gentoo.patch 2176
+AUX qcad-2.0.5.0-1-community.src-intptr.patch 1174 RMD160 131cd2473686ef51326d73f7b2bcddc5b99eedb3 SHA1 596dd7b7cd37646dbcf248c9726d0260dedcff86 SHA256 0b7c0ee65e369aa46e9b0652b5f83fd1961c38f1fee10e9bf86cc1daa19cb7f1
+MD5 92f900fe1fd3a8f841232b587b49c7da files/qcad-2.0.5.0-1-community.src-intptr.patch 1174
+RMD160 131cd2473686ef51326d73f7b2bcddc5b99eedb3 files/qcad-2.0.5.0-1-community.src-intptr.patch 1174
+SHA256 0b7c0ee65e369aa46e9b0652b5f83fd1961c38f1fee10e9bf86cc1daa19cb7f1 files/qcad-2.0.5.0-1-community.src-intptr.patch 1174
+AUX qcad-2.0.5.0-1-community.src-manual.patch 140302 RMD160 8b0580e4393483182815625f363d6a33aeed509e SHA1 3b71abe0820cd0e214a3376166be427407769af6 SHA256 6ff373c071921f761fc1742322ac2f610764fac9763211ab05c84b3b764296f6
+MD5 e3067816ce781ad7c01e632d7704b80c files/qcad-2.0.5.0-1-community.src-manual.patch 140302
+RMD160 8b0580e4393483182815625f363d6a33aeed509e files/qcad-2.0.5.0-1-community.src-manual.patch 140302
+SHA256 6ff373c071921f761fc1742322ac2f610764fac9763211ab05c84b3b764296f6 files/qcad-2.0.5.0-1-community.src-manual.patch 140302
+AUX qcad-2.0.5.0-1-community.src-pedantic.patch 332 RMD160 a04c5d52f1e1ed4a3038ccbf6a4b82f3beaa3e42 SHA1 941355ac05b45d14ffa9740553481766f6a86b63 SHA256 8d2ba5e516b8cd181d20593435968765fb43e77c46679b55e6fd4a59fedc7304
+MD5 b49ee10493b449089491c7a9d35a50b9 files/qcad-2.0.5.0-1-community.src-pedantic.patch 332
+RMD160 a04c5d52f1e1ed4a3038ccbf6a4b82f3beaa3e42 files/qcad-2.0.5.0-1-community.src-pedantic.patch 332
+SHA256 8d2ba5e516b8cd181d20593435968765fb43e77c46679b55e6fd4a59fedc7304 files/qcad-2.0.5.0-1-community.src-pedantic.patch 332
+DIST qcad-2.0.5.0-1-community.src.tar.gz 4470033 RMD160 85f0b6d3c1edaa0c19494436413521316e803429 SHA1 aff563389d1285740f6bf7e28f93b8df0f902e0c SHA256 83327a9598c0ff042025601f5b4cd0582cde541297f3071b01cc0527ffe1511d
+DIST qcad-manual-200404.tar.bz2 1648761 RMD160 600e82d5b17502b3d3e1f86f8e267c3e71b8f41f SHA1 e907beb23b3bac2b3cb6ff7f23616454806251c0 SHA256 ee93845b06100e3d43e839b8880e196203810bcc7786a3a91196a07df84e67c6
+EBUILD qcad-2.0.5.0.ebuild 2937 RMD160 67e692fecf1496b25a35c409e1d7066090531114 SHA1 5e9bbe236fcd44ecd346827bb0ba41c39d65f500 SHA256 4a0a57c7385aa2a5af1b274076667c6271569f279a684c20874c6331c3948524
+MD5 cc4d9ee62fe57f50f3cda61b4f2bfa67 qcad-2.0.5.0.ebuild 2937
+RMD160 67e692fecf1496b25a35c409e1d7066090531114 qcad-2.0.5.0.ebuild 2937
+SHA256 4a0a57c7385aa2a5af1b274076667c6271569f279a684c20874c6331c3948524 qcad-2.0.5.0.ebuild 2937
+MD5 7e68fa4119ae0e57b4e523290b66e483 files/digest-qcad-2.0.5.0 551
+RMD160 c739b75c1551289fa455472c8987fe353d3c6a31 files/digest-qcad-2.0.5.0 551
+SHA256 6e12af79eee57b5a280236ea43b0417e757567b02541ec8d9c4bf3aee9d296ee files/digest-qcad-2.0.5.0 551
diff --git a/sci-misc/qcad/files/digest-qcad-2.0.5.0 b/sci-misc/qcad/files/digest-qcad-2.0.5.0
new file mode 100644
index 0000000..0323397
--- /dev/null
+++ b/sci-misc/qcad/files/digest-qcad-2.0.5.0
@@ -0,0 +1,6 @@
+MD5 96b6a56027782aec953c9c4e64c5998c qcad-2.0.5.0-1-community.src.tar.gz 4470033
+RMD160 85f0b6d3c1edaa0c19494436413521316e803429 qcad-2.0.5.0-1-community.src.tar.gz 4470033
+SHA256 83327a9598c0ff042025601f5b4cd0582cde541297f3071b01cc0527ffe1511d qcad-2.0.5.0-1-community.src.tar.gz 4470033
+MD5 a8cd3682b9405c0de6d5bd77d50da0f2 qcad-manual-200404.tar.bz2 1648761
+RMD160 600e82d5b17502b3d3e1f86f8e267c3e71b8f41f qcad-manual-200404.tar.bz2 1648761
+SHA256 ee93845b06100e3d43e839b8880e196203810bcc7786a3a91196a07df84e67c6 qcad-manual-200404.tar.bz2 1648761
diff --git a/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-gentoo.patch b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-gentoo.patch
new file mode 100644
index 0000000..690e768
--- /dev/null
+++ b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-gentoo.patch
@@ -0,0 +1,60 @@
+diff -ur qcad-2.0.1.0-1.src/qcad/Makefile qcad-2.0.1.0-1.src-gentoo/qcad/Makefile
+--- qcad-2.0.3.1-1.src/qcad/Makefile 2004-04-21 09:59:37.783127376 +0200
++++ Makefile.new 2004-04-21 10:00:52.040865017 +0200
+@@ -17,7 +17,7 @@
+ prepare:
+
+ qcad: src/Makefile src/*.h src/*.cpp ../dxflib/lib/libdxf.a ../qcadguiqt/lib/libqcadguiqt.a ../qcadlib/lib/libqcad.a
+- cd src && $(MAKE)
++ cd src && $(MAKE) $(MAKEOPTS)
+
+ src/Makefile: src/qcad.pro
+ cd src && qmake qcad.pro
+diff -ur qcad-2.0.1.0-1.src/qcadactions/Makefile qcad-2.0.1.0-1.src-gentoo/qcadactions/Makefile
+--- qcad-2.0.1.0-1.src/qcadactions/Makefile 2003-10-08 10:09:03.000000000 +1300
++++ qcad-2.0.1.0-1.src-gentoo/qcadactions/Makefile 2003-10-21 14:27:13.000000000 +1300
+@@ -29,7 +29,7 @@
+
+ ./lib/libqcadactions.a: src/Makefile
+ $(MAKE) src/Makefile
+- cd src && $(MAKE)
++ cd src && $(MAKE) $(MAKEOPTS)
+
+ src/Makefile:
+ cd src && qmake qcadactions.pro
+diff -ur qcad-2.0.1.0-1.src/qcadcmd/Makefile qcad-2.0.1.0-1.src-gentoo/qcadcmd/Makefile
+--- qcad-2.0.1.0-1.src/qcadcmd/Makefile 2003-10-08 10:09:03.000000000 +1300
++++ qcad-2.0.1.0-1.src-gentoo/qcadcmd/Makefile 2003-10-21 14:24:06.000000000 +1300
+@@ -29,7 +29,7 @@
+
+ ./lib/libqcadcmd.a: src/Makefile
+ $(MAKE) src/Makefile
+- cd src && $(MAKE)
++ cd src && $(MAKE) $(MAKEOPTS)
+
+ src/Makefile:
+ cd src && qmake qcadcmd.pro
+diff -ur qcad-2.0.1.0-1.src/qcadguiqt/Makefile qcad-2.0.1.0-1.src-gentoo/qcadguiqt/Makefile
+--- qcad-2.0.1.0-1.src/qcadguiqt/Makefile 2003-10-08 10:09:04.000000000 +1300
++++ qcad-2.0.1.0-1.src-gentoo/qcadguiqt/Makefile 2003-10-21 14:53:40.000000000 +1300
+@@ -89,7 +89,7 @@
+ done )
+
+ ./lib/libqcadguiqt.a: src/Makefile
+- cd src && $(MAKE)
++ cd src && $(MAKE) $(MAKEOPTS)
+
+ src/Makefile:
+ cd src && qmake qcadguiqt.pro
+diff -ur qcad-2.0.1.0-1.src/qcadlib/Makefile qcad-2.0.1.0-1.src-gentoo/qcadlib/Makefile
+--- qcad-2.0.1.0-1.src/qcadlib/Makefile 2003-10-08 10:09:02.000000000 +1300
++++ qcad-2.0.1.0-1.src-gentoo/qcadlib/Makefile 2003-10-21 14:23:55.000000000 +1300
+@@ -29,7 +29,7 @@
+
+ ./lib/libqcad.a: src/Makefile
+ $(MAKE) src/Makefile
+- cd src && $(MAKE)
++ cd src && $(MAKE) $(MAKEOPTS)
+
+ src/Makefile:
+ cd src && qmake qcadlib.pro
diff --git a/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-intptr.patch b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-intptr.patch
new file mode 100644
index 0000000..6d8b6ac
--- /dev/null
+++ b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-intptr.patch
@@ -0,0 +1,24 @@
+diff -Naur qcad-2.0.4.0-1.src.orig/qcadlib/src/engine/rs_entity.cpp qcad-2.0.4.0-1.src.patched/qcadlib/src/engine/rs_entity.cpp
+--- qcad-2.0.4.0-1.src.orig/qcadlib/src/engine/rs_entity.cpp 2004-09-14 15:13:02.000000000 -0500
++++ qcad-2.0.4.0-1.src.patched/qcadlib/src/engine/rs_entity.cpp 2006-06-23 14:21:40.000000000 -0500
+@@ -849,7 +849,7 @@
+ os << " layer: NULL ";
+ } else {
+ os << " layer: " << e.layer->getName().latin1() << " ";
+- os << " layer address: " << (int)(e.layer) << " ";
++ os << " layer address: " << (intptr_t)(e.layer) << " ";
+ }
+
+ os << e.pen << "\n";
+diff -Naur qcad-2.0.4.0-1.src.orig/qcadlib/src/engine/rs_layer.cpp qcad-2.0.4.0-1.src.patched/qcadlib/src/engine/rs_layer.cpp
+--- qcad-2.0.4.0-1.src.orig/qcadlib/src/engine/rs_layer.cpp 2004-09-14 15:13:02.000000000 -0500
++++ qcad-2.0.4.0-1.src.patched/qcadlib/src/engine/rs_layer.cpp 2006-06-23 14:21:23.000000000 -0500
+@@ -57,7 +57,7 @@
+ os << " name: " << l.getName().latin1()
+ << " pen: " << l.getPen()
+ << " frozen: " << (int)l.isFrozen()
+- << " address: " << (int)(&l)
++ << " address: " << (intptr_t)(&l)
+ << std::endl;
+ return os;
+ }
diff --git a/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-manual.patch b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-manual.patch
new file mode 100644
index 0000000..9279524
--- /dev/null
+++ b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-manual.patch
@@ -0,0 +1,4101 @@
+--- qcad/src/qc_applicationwindow.cpp.old 1970-01-01 01:00:00.000000000 +0100
++++ qcad/src/qc_applicationwindow.cpp 2005-11-22 12:49:33.000000000 +0100
+@@ -0,0 +1,4098 @@
++/****************************************************************************
++** $Id: qc_applicationwindow.cpp 2416 2005-06-17 10:50:10Z andrew $
++**
++** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
++**
++** This file is part of the QCad project.
++**
++** This file may be distributed and/or modified under the terms of the
++** GNU General Public License version 2 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file.
++**
++** Licensees holding valid QCad Professional Edition licenses may use
++** this file in accordance with the qcadlib Commercial License
++** Agreement provided with the Software.
++**
++** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
++** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
++**
++** See http://www.ribbonsoft.com for further details.
++**
++** Contact info@ribbonsoft.com if any conditions of this licensing are
++** not clear to you.
++**
++**********************************************************************/
++
++#include "qc_applicationwindow.h"
++
++#include <fstream>
++
++#include <qaccel.h>
++#include <qaction.h>
++#include <qapplication.h>
++#include <qdatetime.h>
++#include <qfile.h>
++#include <qfiledialog.h>
++#include <qkeycode.h>
++#include <qmessagebox.h>
++#include <qpaintdevicemetrics.h>
++#include <qpainter.h>
++#include <qprinter.h>
++#include <qtimer.h>
++#include <qtextstream.h>
++#include <qvbox.h>
++
++#if QT_VERSION>=0x030000
++#include <qdockwindow.h>
++#include <qeventloop.h>
++#include <qtextedit.h>
++#endif
++
++#include "rs_application.h"
++#include "rs_actiondrawlinefree.h"
++#include "rs_actionprintpreview.h"
++#include "rs_creation.h"
++#include "rs_dialogfactory.h"
++#include "rs_dimaligned.h"
++#include "rs_dimlinear.h"
++#include "rs_dimradial.h"
++#include "rs_ellipse.h"
++#include "rs_hatch.h"
++#include "rs_image.h"
++#include "rs_fileio.h"
++#include "rs_insert.h"
++#include "rs_text.h"
++#include "rs_settings.h"
++#include "rs_script.h"
++#include "rs_scriptlist.h"
++#include "rs_solid.h"
++#include "rs_staticgraphicview.h"
++#include "rs_system.h"
++#include "rs_actionlibraryinsert.h"
++
++#ifdef RS_CAM
++#include "rs_camdialog.h"
++#include "rs_simulationcontrols.h"
++#endif
++
++#include "qg_cadtoolbarmain.h"
++#include "qg_colorbox.h"
++#include "qg_coordinatewidget.h"
++#include "qg_dlgimageoptions.h"
++#include "qg_filedialog.h"
++#include "qg_mousewidget.h"
++#include "qg_pentoolbar.h"
++#include "qg_selectionwidget.h"
++#include "qg_cadtoolbarmain.h"
++#include "qg_dlgimageoptions.h"
++#include "qg_mousewidget.h"
++
++#include "qc_mdiwindow.h"
++#include "qc_dialogfactory.h"
++#include "main.h"
++
++QC_ApplicationWindow* QC_ApplicationWindow::appWindow = NULL;
++
++#ifndef QC_APP_ICON
++# define QC_APP_ICON "qcad.png"
++#endif
++#ifndef QC_APP_ICON16
++# define QC_APP_ICON16 "qcad16.png"
++#endif
++
++#if QT_VERSION>=0x030200
++# include <qsplashscreen.h>
++ extern QSplashScreen *splash;
++#endif
++
++/**
++ * Constructor. Initializes the app.
++ */
++QC_ApplicationWindow::QC_ApplicationWindow()
++ : QMainWindow(0, "", WDestructiveClose),
++ QG_MainWindowInterface()
++{
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow");
++
++ appWindow = this;
++ assistant = NULL;
++ workspace = NULL;
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: setting icon");
++ setIcon(QPixmap::fromMimeSource(QC_APP_ICON));
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating action handler");
++ actionHandler = new QG_ActionHandler(this);
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating action handler: OK");
++
++#ifdef RS_SCRIPTING
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating scripter");
++ scripter = new QS_Scripter(this, this);
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating scripter: OK");
++#endif
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init view");
++ initView();
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init toolbar");
++ initToolBar();
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init actions");
++ initActions();
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init menu bar");
++ initMenuBar();
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init status bar");
++ initStatusBar();
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating dialogFactory");
++ dialogFactory = new QC_DialogFactory(this, optionWidget);
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: creating dialogFactory: OK");
++ RS_DEBUG->print("setting dialog factory object");
++ if (RS_DialogFactory::instance()==NULL) {
++ RS_DEBUG->print("no RS_DialogFactory instance");
++ }
++ else {
++ RS_DEBUG->print("got RS_DialogFactory instance");
++ }
++ RS_DialogFactory::instance()->setFactoryObject(dialogFactory);
++ RS_DEBUG->print("setting dialog factory object: OK");
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init settings");
++ initSettings();
++
++ RS_DEBUG->print("QC_ApplicationWindow::QC_ApplicationWindow: init MDI");
++ initMDI();
++
++ // Disable menu and toolbar items
++ emit windowsChanged(FALSE);
++
++
++ statusBar()->message(QC_APPNAME " Ready", 2000);
++ //setFocusPolicy(WheelFocus);
++}
++
++
++
++/**
++ * Destructor.
++ */
++QC_ApplicationWindow::~QC_ApplicationWindow() {
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow");
++#ifdef RS_SCRIPTING
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting scripter");
++
++ delete scripter;
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting scripter: OK");
++
++#endif
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting action handler");
++
++ delete actionHandler;
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting action handler: OK");
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting dialog factory");
++
++ delete dialogFactory;
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting dialog factory: OK");
++
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting assistant..");
++ if (assistant!=NULL) {
++ delete assistant;
++ }
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: "
++ "deleting assistant: OK");
++ RS_DEBUG->print("QC_ApplicationWindow::~QC_ApplicationWindow: OK");
++}
++
++
++
++/**
++ * Runs the start script if scripting is available.
++ */
++void QC_ApplicationWindow::slotRunStartScript() {
++ slotRunScript("autostart.qs");
++ restoreDocks();
++}
++
++
++
++/**
++ * Runs a script. The action that triggers this slot has to carry the
++ * name of the script file.
++ */
++void QC_ApplicationWindow::slotRunScript() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotRunScript");
++
++ const QObject* s = sender();
++ if (s!=NULL) {
++ QString script = ((QAction*)s)->text();
++ RS_DEBUG->print("QC_ApplicationWindow::slotRunScript: %s",
++ script.latin1());
++ slotRunScript(script);
++ }
++}
++
++
++
++/**
++ * Runs the script with the given name.
++ */
++void QC_ApplicationWindow::slotRunScript(const QString& name) {
++#ifdef RS_SCRIPTING
++ RS_DEBUG->print("QC_ApplicationWindow::slotRunScript");
++
++ if (scripter==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotRunScript: "
++ "scripter not initialized");
++ return;
++ }
++
++ statusBar()->message(tr("Running script '%1'").arg(name), 2000);
++
++ QStringList scriptList = RS_SYSTEM->getScriptList();
++ scriptList.append(RS_SYSTEM->getHomeDir() + "/.qcad/" + name);
++
++ for (QStringList::Iterator it = scriptList.begin(); it!=scriptList.end(); ++it) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotRunScript: "
++ "checking script '%s'", (*it).latin1());
++ QFileInfo fi(*it);
++ if (fi.exists() && fi.fileName()==name) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotRunScript: running '%s'",
++ (*it).latin1());
++ scripter->runScript(*it, "main");
++ }
++ }
++#endif
++}
++
++
++
++/**
++ * Called from toolbar buttons that were added by scripts to
++ * insert blocks.
++ */
++void QC_ApplicationWindow::slotInsertBlock() {
++ const QObject* s = sender();
++ if (s!=NULL) {
++ QString block = ((QAction*)s)->text();
++ RS_DEBUG->print("QC_ApplicationWindow::slotInsertBlock: %s",
++ block.latin1());
++ slotInsertBlock(block);
++ }
++}
++
++
++
++/**
++ * Called to insert blocks.
++ */
++void QC_ApplicationWindow::slotInsertBlock(const QString& name) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotInsertBlock: '%s'", name.latin1());
++
++ statusBar()->message(tr("Inserting block '%1'").arg(name), 2000);
++
++ RS_GraphicView* graphicView = getGraphicView();
++ RS_Document* document = getDocument();
++ if (graphicView!=NULL && document!=NULL) {
++ RS_ActionLibraryInsert* action =
++ new RS_ActionLibraryInsert(*document, *graphicView);
++ action->setFile(name);
++ graphicView->setCurrentAction(action);
++ }
++}
++
++
++
++/**
++ * Shows the main application window and a splash screen.
++ */
++void QC_ApplicationWindow::show() {
++#ifdef QSPLASHSCREEN_H
++ if (splash) {
++ splash->raise();
++ }
++#endif
++
++ QMainWindow::show();
++#ifdef QSPLASHSCREEN_H
++ if (splash) {
++ splash->raise();
++ qApp->processEvents();
++ splash->clear();
++# ifdef QC_DELAYED_SPLASH_SCREEN
++ QTimer::singleShot(1000*2, this, SLOT(finishSplashScreen()));
++# else
++ finishSplashScreen();
++# endif
++ }
++#endif
++}
++
++
++
++/**
++ * Called when the splash screen has to terminate.
++ */
++void QC_ApplicationWindow::finishSplashScreen() {
++#ifdef QSPLASHSCREEN_H
++ if (splash) {
++ splash->finish(this);
++ delete splash;
++ splash = 0;
++ }
++#endif
++}
++
++
++
++/**
++ * Close Event. Called when the user tries to close the app.
++ */
++void QC_ApplicationWindow::closeEvent(QCloseEvent* /*ce*/) {
++ RS_DEBUG->print("QC_ApplicationWindow::closeEvent()");
++
++ slotFileQuit();
++
++ RS_DEBUG->print("QC_ApplicationWindow::closeEvent(): OK");
++}
++
++
++
++/**
++ * Handles right-clicks for moving back to the last cad tool bar.
++ */
++void QC_ApplicationWindow::mouseReleaseEvent(QMouseEvent* e) {
++ if (e->button()==RightButton && cadToolBar!=NULL) {
++ cadToolBar->showToolBarMain();
++ }
++ e->accept();
++}
++
++
++
++/**
++ * Initializes the MDI workspace.
++ */
++void QC_ApplicationWindow::initMDI() {
++ RS_DEBUG->print("QC_ApplicationWindow::initMDI() begin");
++
++ QVBox* vb = new QVBox(this);
++ vb->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
++ workspace = new QWorkspace(vb);
++ workspace->setScrollBarsEnabled(true);
++ setCentralWidget(vb);
++
++ connect(workspace, SIGNAL(windowActivated(QWidget*)),
++ this, SLOT(slotWindowActivated(QWidget*)));
++
++ RS_DEBUG->print("QC_ApplicationWindow::initMDI() end");
++}
++
++
++
++/**
++ * Initializes all QActions of the application.
++ */
++void QC_ApplicationWindow::initActions() {
++ RS_DEBUG->print("QC_ApplicationWindow::initActions()");
++
++ QG_ActionFactory actionFactory(actionHandler, this);
++ QAction* action;
++ QPopupMenu* menu;
++ QToolBar* tb;
++ QPopupMenu* subMenu;
++
++
++ // File actions:
++ //
++ menu = new QPopupMenu(this);
++ tb = fileToolBar;
++ tb->setCaption("File");
++#if QT_VERSION>=0x030000
++
++ tb->setCloseMode(QDockWindow::Undocked);
++#endif
++
++ action = actionFactory.createAction(RS2::ActionFileNew, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ action = actionFactory.createAction(RS2::ActionFileOpen, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ action = actionFactory.createAction(RS2::ActionFileSave, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionFileSaveAs, this);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionFileExport, this);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertSeparator();
++ action = actionFactory.createAction(RS2::ActionFileClose, this);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertSeparator();
++ action = actionFactory.createAction(RS2::ActionFilePrint, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionFilePrintPreview, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(printPreviewChanged(bool)), action, SLOT(setOn(bool)));
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertSeparator();
++ action = actionFactory.createAction(RS2::ActionFileQuit, this);
++ action->addTo(menu);
++ menu->insertSeparator();
++ menuBar()->insertItem(tr("&File"), menu);
++ //addToolBar(tb, tr("File"));
++ addDockWindow(tb, tr("File"), DockTop);
++ fileMenu = menu;
++
++ // Editing actions:
++ //
++ menu=new QPopupMenu(this);
++ tb = editToolBar;
++ tb->setCaption("Edit");
++#if QT_VERSION>=0x030000
++
++ tb->setCloseMode(QDockWindow::Undocked);
++#endif
++
++ action = actionFactory.createAction(RS2::ActionEditUndo, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionEditRedo, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ tb->addSeparator();
++ menu->insertSeparator();
++
++ action = actionFactory.createAction(RS2::ActionEditCut, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionEditCopy, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionEditPaste, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ menu->insertSeparator();
++
++ action = actionFactory.createAction(RS2::ActionOptionsGeneral, this);
++ action->addTo(menu);
++ action = actionFactory.createAction(RS2::ActionOptionsDrawing, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ menuBar()->insertItem(tr("&Edit"), menu);
++ //addToolBar(tb, tr("Edit"));
++ addDockWindow(tb, tr("Edit"), DockTop);
++
++ // Options menu:
++ //
++ //menu = new QPopupMenu(this);
++ //menuBar()->insertItem(tr("&Options"), menu);
++
++ // Viewing / Zooming actions:
++ //
++ menu = new QPopupMenu(this);
++ menu->setCheckable(true);
++ tb = zoomToolBar;
++ tb->setCaption("View");
++#if QT_VERSION>=0x030000
++
++ tb->setCloseMode(QDockWindow::Undocked);
++#endif
++
++ action = actionFactory.createAction(RS2::ActionViewGrid, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ action->setOn(true);
++ connect(this, SIGNAL(gridChanged(bool)), action, SLOT(setOn(bool)));
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ RS_SETTINGS->beginGroup("/Appearance");
++ bool draftMode = (bool)RS_SETTINGS->readNumEntry("/DraftMode", 0);
++ RS_SETTINGS->endGroup();
++
++ action = actionFactory.createAction(RS2::ActionViewDraft, this);
++ action->addTo(menu);
++ action->addTo(tb);
++ action->setOn(draftMode);
++ connect(this, SIGNAL(draftChanged(bool)), action, SLOT(setOn(bool)));
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ /*
++ action = actionFactory.createAction(RS2::ActionViewLayerList, this);
++ action->addTo(menu);
++ action->setOn(true);
++ action = actionFactory.createAction(RS2::ActionViewBlockList, this);
++ action->addTo(menu);
++ action->setOn(true);
++ action = actionFactory.createAction(RS2::ActionViewOptionToolbar, this);
++ action->addTo(menu);
++ action->setOn(true);
++ action = actionFactory.createAction(RS2::ActionViewCommandLine, this);
++ action->addTo(menu);
++ action->setOn(true);*/
++
++ /*
++ action = new QAction(tr("Back"),
++ tr("&Back"), Key_Escape, this);
++ connect(action, SIGNAL(activated()),
++ this, SLOT(slotBack()));
++ action->addTo(menu);
++ */
++
++
++ action = actionFactory.createAction(RS2::ActionZoomRedraw, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomIn, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomOut, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomAuto, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomPrevious, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomWindow, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionZoomPan, actionHandler);
++ action->addTo(menu);
++ action->addTo(tb);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++
++ menu->insertSeparator();
++
++ action = actionFactory.createAction(RS2::ActionViewStatusBar, this);
++ action->addTo(menu);
++ action->setOn(true);
++
++ menu->insertItem(tr("Vie&ws"), createDockWindowMenu(NoToolBars));
++ menu->insertItem(tr("Tool&bars"), createDockWindowMenu(OnlyToolBars));
++
++ action = new QAction(tr("Focus on Command Line"), QPixmap::fromMimeSource("editclear.png"),
++ tr("Focus on &Command Line"), Key_Space, this);
++ connect(action, SIGNAL(activated()),
++ this, SLOT(slotFocusCommandLine()));
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&View"), menu);
++ //addToolBar(tb, tr("View"));
++ addDockWindow(tb, tr("View"), DockTop);
++
++ // Selecting actions:
++ //
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDeselectAll, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectAll, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectSingle, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectContour, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDeselectWindow, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectWindow, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectInvert, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectIntersected,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDeselectIntersected,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSelectLayer, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Select"), menu);
++
++ // Drawing actions:
++ //
++ menu=new QPopupMenu(this);
++
++ // Points:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawPoint, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Point"), subMenu);
++
++ // Lines:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawLine,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineAngle,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineHorizontal,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineVertical,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineRectangle,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineParallel,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineParallelThrough,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineBisector,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineTangent1,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineTangent2,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineOrthogonal,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineRelAngle,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLineFree,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ //action = actionFactory.createAction(RS2::ActionDrawLineHorVert,
++ // actionHandler);
++ //action->addTo(subMenu);
++ action = actionFactory.createAction(RS2::ActionDrawLinePolygon,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawLinePolygon2,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++#ifdef RS_PROF
++ action = actionFactory.createAction(RS2::ActionDrawPolyline,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++#endif
++ menu->insertItem(tr("&Line"), subMenu);
++
++ // Arcs:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawArc, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawArc3P, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawArcParallel, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Arc"), subMenu);
++ // Circles:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawCircle, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawCircleCR, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawCircle2P, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawCircle3P, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawCircleParallel, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Circle"), subMenu);
++
++ // Ellipses:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawEllipseAxis,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDrawEllipseArcAxis,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Ellipse"), subMenu);
++
++ // Splines:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawSpline, actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Spline"), subMenu);
++
++#ifdef RS_PROF
++ // Polylines:
++ subMenu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDrawPolyline,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionPolylineAdd,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionPolylineDel,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionPolylineDelBetween,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionPolylineTrim,
++ actionHandler);
++ action->addTo(subMenu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertItem(tr("&Polyline"), subMenu);
++#endif
++
++ // Text:
++ action = actionFactory.createAction(RS2::ActionDrawText,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ // Hatch:
++ action = actionFactory.createAction(RS2::ActionDrawHatch,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ // Image:
++ action = actionFactory.createAction(RS2::ActionDrawImage,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Draw"), menu);
++
++ // Dimensioning actions:
++ //
++#ifdef __APPLE__
++
++ QPopupMenu* m = menu;
++#endif
++
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionDimAligned, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimLinear, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimLinearHor, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimLinearVer, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimRadial, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimDiametric, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimAngular, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionDimLeader, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++#ifdef __APPLE__
++
++ m->insertItem(tr("&Dimension"), menu);
++#else
++
++ menuBar()->insertItem(tr("&Dimension"), menu);
++#endif
++
++ // Modifying actions:
++ //
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionModifyMove,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyRotate,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyScale,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyMirror,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyMoveRotate,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyRotate2,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyTrim,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyTrim2,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyTrimAmount,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyBevel,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyRound,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyCut,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyStretch,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyEntity,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyAttributes,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyDelete,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyDeleteQuick,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionModifyExplodeText,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ //action = actionFactory.createAction(RS2::ActionModifyDeleteFree,
++ // actionHandler);
++ //action->addTo(menu);
++ action = actionFactory.createAction(RS2::ActionBlocksExplode, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Modify"), menu);
++
++ // Snapping actions:
++ //
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionSnapFree, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action->setOn(true);
++ action = actionFactory.createAction(RS2::ActionSnapGrid, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapEndpoint,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapOnEntity,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapCenter, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapMiddle, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapDist, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapIntersection,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionSnapIntersectionManual,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertSeparator();
++ action = actionFactory.createAction(RS2::ActionRestrictNothing,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionRestrictOrthogonal,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionRestrictHorizontal,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionRestrictVertical,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menu->insertSeparator();
++ action = actionFactory.createAction(RS2::ActionSetRelativeZero,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLockRelativeZero,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Snap"), menu);
++
++ // Info actions:
++ //
++ menu=new QPopupMenu(this);
++ //action = actionFactory.createAction(RS2::ActionInfoInside,
++ // actionHandler);
++ //action->addTo(menu);
++ action = actionFactory.createAction(RS2::ActionInfoDist,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionInfoDist2,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionInfoAngle,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionInfoTotalLength,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Info"), menu);
++
++ // Layer actions:
++ //
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionLayersDefreezeAll,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLayersFreezeAll,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLayersAdd, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLayersRemove,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLayersEdit, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionLayersToggleView,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Layer"), menu);
++
++ // Block actions:
++ //
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionBlocksDefreezeAll,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksFreezeAll,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksAdd, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksRemove, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksAttributes,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksInsert,
++ actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksEdit, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksCreate, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionBlocksExplode, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&Block"), menu);
++
++
++ addDockWindow(penToolBar, tr("Pen"), DockTop);
++ addDockWindow(optionWidget, tr("Tool Options"), DockTop, true);
++
++#ifdef RS_SCRIPTING
++ // Scripts menu:
++ //
++ scriptMenu = new QPopupMenu(this);
++ scriptOpenIDE = actionFactory.createAction(RS2::ActionScriptOpenIDE, this);
++ scriptOpenIDE->addTo(scriptMenu);
++ scriptRun = actionFactory.createAction(RS2::ActionScriptRun, this);
++ scriptRun->addTo(scriptMenu);
++#else
++ scriptMenu = 0;
++ scriptOpenIDE = 0;
++ scriptRun = 0;
++#endif
++
++ // CAM menu:
++#ifdef RS_CAM
++
++ menu=new QPopupMenu(this);
++ action = actionFactory.createAction(RS2::ActionCamExportAuto, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ action = actionFactory.createAction(RS2::ActionCamReorder, actionHandler);
++ action->addTo(menu);
++ connect(this, SIGNAL(windowsChanged(bool)), action, SLOT(setEnabled(bool)));
++ menuBar()->insertItem(tr("&CAM"), menu);
++#endif
++
++ // Help menu:
++ //
++ helpAboutApp = new QAction(tr("About"),
++ QPixmap::fromMimeSource(QC_APP_ICON16),
++ tr("&About %1").arg(QC_APPNAME), 0, this);
++ helpAboutApp->setStatusTip(tr("About the application"));
++ //helpAboutApp->setWhatsThis(tr("About\n\nAbout the application"));
++ connect(helpAboutApp, SIGNAL(activated()),
++ this, SLOT(slotHelpAbout()));
++
++ helpManual = new QAction(QPixmap::fromMimeSource("contents.png"), tr("&Manual"), Key_F1, this);
++ helpManual->setStatusTip(tr("Launch the online manual"));
++ connect(helpManual, SIGNAL(activated()),
++ this, SLOT(slotHelpManual()));
++
++ testDumpEntities = new QAction("Dump Entities",
++ "Dump &Entities", 0, this);
++ connect(testDumpEntities, SIGNAL(activated()),
++ this, SLOT(slotTestDumpEntities()));
++
++ testDumpUndo = new QAction("Dump Undo Info",
++ "Undo Info", 0, this);
++ connect(testDumpUndo, SIGNAL(activated()),
++ this, SLOT(slotTestDumpUndo()));
++
++ testUpdateInserts = new QAction("Update Inserts",
++ "&Update Inserts", 0, this);
++ connect(testUpdateInserts, SIGNAL(activated()),
++ this, SLOT(slotTestUpdateInserts()));
++
++ testDrawFreehand = new QAction("Draw Freehand",
++ "Draw Freehand", 0, this);
++ connect(testDrawFreehand, SIGNAL(activated()),
++ this, SLOT(slotTestDrawFreehand()));
++
++ testInsertBlock = new QAction("Insert Block",
++ "Insert Block", 0, this);
++ connect(testInsertBlock, SIGNAL(activated()),
++ this, SLOT(slotTestInsertBlock()));
++
++ testInsertText = new QAction("Insert Text",
++ "Insert Text", 0, this);
++ connect(testInsertText, SIGNAL(activated()),
++ this, SLOT(slotTestInsertText()));
++
++ testInsertImage = new QAction("Insert Image",
++ "Insert Image", 0, this);
++ connect(testInsertImage, SIGNAL(activated()),
++ this, SLOT(slotTestInsertImage()));
++
++ testUnicode = new QAction("Unicode",
++ "Unicode", 0, this);
++ connect(testUnicode, SIGNAL(activated()),
++ this, SLOT(slotTestUnicode()));
++
++ testInsertEllipse = new QAction("Insert Ellipse",
++ "Insert Ellipse", 0, this);
++ connect(testInsertEllipse, SIGNAL(activated()),
++ this, SLOT(slotTestInsertEllipse()));
++
++ testMath01 = new QAction("Math01",
++ "Math01", 0, this);
++ connect(testMath01, SIGNAL(activated()),
++ this, SLOT(slotTestMath01()));
++
++ testResize640 = new QAction("Resize to 640x480",
++ "Resize 1", 0, this);
++ connect(testResize640, SIGNAL(activated()),
++ this, SLOT(slotTestResize640()));
++
++ testResize800 = new QAction("Resize to 800x600",
++ "Resize 2", 0, this);
++ connect(testResize800, SIGNAL(activated()),
++ this, SLOT(slotTestResize800()));
++
++ testResize1024 = new QAction("Resize to 1024x768",
++ "Resize 3", 0, this);
++ connect(testResize1024, SIGNAL(activated()),
++ this, SLOT(slotTestResize1024()));
++
++}
++
++
++/**
++ * Initializes the menu bar.
++ */
++void QC_ApplicationWindow::initMenuBar() {
++ RS_DEBUG->print("QC_ApplicationWindow::initMenuBar()");
++
++ // menuBar entry windowsMenu
++ windowsMenu = new QPopupMenu(this);
++ windowsMenu->setCheckable(true);
++ connect(windowsMenu, SIGNAL(aboutToShow()),
++ this, SLOT(slotWindowsMenuAboutToShow()));
++
++ // menuBar entry scriptMenu
++ //scriptMenu = new QPopupMenu(this);
++ //scriptMenu->setCheckable(true);
++ //scriptOpenIDE->addTo(scriptMenu);
++ //scriptRun->addTo(scriptMenu);
++ //connect(scriptMenu, SIGNAL(aboutToShow()),
++ // this, SLOT(slotScriptMenuAboutToShow()));
++
++ // menuBar entry helpMenu
++ helpMenu=new QPopupMenu();
++ helpManual->addTo(helpMenu);
++ helpMenu->insertSeparator();
++ helpAboutApp->addTo(helpMenu);
++
++ // menuBar entry test menu
++ testMenu=new QPopupMenu();
++ testDumpEntities->addTo(testMenu);
++ testDumpUndo->addTo(testMenu);
++ testUpdateInserts->addTo(testMenu);
++ testDrawFreehand->addTo(testMenu);
++ testInsertBlock->addTo(testMenu);
++ testInsertText->addTo(testMenu);
++ testInsertImage->addTo(testMenu);
++ testInsertEllipse->addTo(testMenu);
++ testUnicode->addTo(testMenu);
++ testMath01->addTo(testMenu);
++ testResize640->addTo(testMenu);
++ testResize800->addTo(testMenu);
++ testResize1024->addTo(testMenu);
++
++ // menuBar configuration
++#ifdef RS_SCRIPTING
++ menuBar()->insertItem(tr("&Scripts"), scriptMenu);
++#endif
++ menuBar()->insertItem(tr("&Window"), windowsMenu);
++ menuBar()->insertSeparator();
++ menuBar()->insertItem(tr("&Help"), helpMenu);
++ if (QC_DEBUGGING) {
++ menuBar()->insertItem(tr("De&bugging"), testMenu);
++ }
++
++ recentFiles = new QG_RecentFiles(9);
++}
++
++
++
++/**
++ * Initializes the tool bars (file tool bar and pen tool bar).
++ */
++void QC_ApplicationWindow::initToolBar() {
++ RS_DEBUG->print("QC_ApplicationWindow::initToolBar()");
++
++ fileToolBar = new QToolBar(this, "File Operations");
++ editToolBar = new QToolBar(this, "Edit Operations");
++ zoomToolBar = new QToolBar(this, "Zoom Operations");
++ penToolBar = new QG_PenToolBar(this, "Pen Selection");
++
++ connect(penToolBar, SIGNAL(penChanged(RS_Pen)),
++ this, SLOT(slotPenChanged(RS_Pen)));
++
++ optionWidget = new QToolBar(this, "Tool Options");
++ optionWidget->setFixedExtentHeight(26);
++ //optionWidget->setHorizontallyStretchable(true);
++ //addDockWindow(optionWidget, DockTop, true);
++
++ // CAD toolbar left:
++ QToolBar* t = new QToolBar(this, "CAD Tools");
++ t->setFixedExtentWidth(59);
++ t->setVerticallyStretchable(true);
++ addDockWindow(t, DockLeft, false);
++
++ cadToolBar = new QG_CadToolBar(t, "CAD Tools");
++ cadToolBar->createSubToolBars(actionHandler);
++
++ connect(cadToolBar, SIGNAL(signalBack()),
++ this, SLOT(slotBack()));
++ connect(this, SIGNAL(windowsChanged(bool)),
++ cadToolBar, SLOT(setEnabled(bool)));
++
++ //QG_CadToolBarMain* cadToolBarMain =
++ //new QG_CadToolBarMain(cadToolBar);
++}
++
++
++
++/**
++ * Initializes the status bar at the bottom.
++ */
++void QC_ApplicationWindow::initStatusBar() {
++ RS_DEBUG->print("QC_ApplicationWindow::initStatusBar()");
++
++ statusBar()->setMinimumHeight(32);
++ coordinateWidget = new QG_CoordinateWidget(statusBar(), "coordinates");
++ statusBar()->addWidget(coordinateWidget);
++ mouseWidget = new QG_MouseWidget(statusBar(), "mouse info");
++ statusBar()->addWidget(mouseWidget);
++ selectionWidget = new QG_SelectionWidget(statusBar(), "selections");
++ statusBar()->addWidget(selectionWidget);
++}
++
++
++
++/**
++ * Initializes the global application settings from the
++ * config file (unix, mac) or registry (windows).
++ */
++void QC_ApplicationWindow::initSettings() {
++ RS_DEBUG->print("QC_ApplicationWindow::initSettings()");
++
++ //RS_Settings settings(QC_REGISTRY, QC_APPKEY);
++
++ RS_SETTINGS->beginGroup("/RecentFiles");
++ for (int i=0; i<recentFiles->getNumber(); ++i) {
++ QString filename = RS_SETTINGS->readEntry(QString("/File") +
++ QString::number(i+1));
++ if (!filename.isEmpty()) {
++ recentFiles->add(filename);
++ }
++ }
++ RS_SETTINGS->endGroup();
++ if (recentFiles->count()>0) {
++ updateRecentFilesMenu();
++ }
++
++ RS_SETTINGS->beginGroup("/Geometry");
++ int windowWidth = RS_SETTINGS->readNumEntry("/WindowWidth", 950);
++ int windowHeight = RS_SETTINGS->readNumEntry("/WindowHeight", 700);
++ int windowX = RS_SETTINGS->readNumEntry("/WindowX", 0);
++ int windowY = RS_SETTINGS->readNumEntry("/WindowY", 30);
++ RS_SETTINGS->endGroup();
++
++#ifdef __APPLE__
++ if (windowY<30) {
++ windowY=30;
++ }
++#endif
++
++ resize(windowWidth, windowHeight);
++ move(windowX, windowY);
++
++ restoreDocks();
++}
++
++
++/**
++ * Restores the position of the dock windows.
++ */
++void QC_ApplicationWindow::restoreDocks() {
++ RS_SETTINGS->beginGroup("/Geometry");
++ QString docks = RS_SETTINGS->readEntry("/DockWindows", "");
++ RS_SETTINGS->endGroup();
++
++ QTextStream ts(&docks, IO_ReadOnly);
++ ts >> *this;
++}
++
++
++/**
++ * Stores the global application settings to file or registry.
++ */
++void QC_ApplicationWindow::storeSettings() {
++ RS_DEBUG->print("QC_ApplicationWindow::storeSettings()");
++ QString docks;
++ QTextStream ts(&docks, IO_WriteOnly);
++
++ RS_SETTINGS->beginGroup("/RecentFiles");
++ for (int i=0; i<recentFiles->count(); ++i) {
++ RS_SETTINGS->writeEntry(QString("/File") +
++ QString::number(i+1), recentFiles->get(i));
++ }
++ RS_SETTINGS->endGroup();
++
++ RS_SETTINGS->beginGroup("/Geometry");
++ RS_SETTINGS->writeEntry("/WindowWidth", width());
++ RS_SETTINGS->writeEntry("/WindowHeight", height());
++ RS_SETTINGS->writeEntry("/WindowX", x());
++ RS_SETTINGS->writeEntry("/WindowY", y());
++ ts << *this;
++ RS_SETTINGS->writeEntry("/DockWindows", docks);
++ RS_SETTINGS->endGroup();
++
++ RS_DEBUG->print("QC_ApplicationWindow::storeSettings(): OK");
++}
++
++
++
++/**
++ * Initializes the view.
++ */
++void QC_ApplicationWindow::initView() {
++ RS_DEBUG->print("QC_ApplicationWindow::initView()");
++
++ RS_DEBUG->print("init view..");
++ QDockWindow* dw;
++ layerWidget = NULL;
++ blockWidget = NULL;
++ libraryWidget = NULL;
++ commandWidget = NULL;
++#ifdef RS_CAM
++
++ simulationControls = NULL;
++#endif
++
++#if QT_VERSION>=0x030000
++
++#ifdef RS_CAM
++
++ RS_DEBUG->print(" simulation widget..");
++ dw = new QDockWindow(QDockWindow::InDock, this, "Simulation");
++ simulationControls = new RS_SimulationControls(dw, "Simulation");
++ simulationControls->setFocusPolicy(QWidget::NoFocus);
++ connect(simulationControls, SIGNAL(escape()),
++ this, SLOT(slotFocus()));
++ connect(this, SIGNAL(windowsChanged(bool)),
++ simulationControls, SLOT(setEnabled(bool)));
++ dw->setWidget(simulationControls);
++ dw->resize(240, 80);
++ dw->setResizeEnabled(true);
++ dw->setFixedExtentWidth(120);
++ //dw->setFixedExtentHeight(80);
++ //dw->setFixedExtentHeight(400);
++ dw->setFixedHeight(80);
++ dw->setCaption(tr("Simulation Controls"));
++ dw->setCloseMode(QDockWindow::Always);
++ //dw->resize(120,workspace->height()/2);
++ addDockWindow(dw, DockRight);
++ simulationDockWindow = dw;
++ //simulationDockWindow->hide();
++#endif
++
++ RS_DEBUG->print(" layer widget..");
++ dw = new QDockWindow(QDockWindow::InDock, this, "Layer");
++ layerWidget = new QG_LayerWidget(actionHandler, dw, "Layer");
++ layerWidget->setFocusPolicy(QWidget::NoFocus);
++ connect(layerWidget, SIGNAL(escape()),
++ this, SLOT(slotFocus()));
++ connect(this, SIGNAL(windowsChanged(bool)),
++ layerWidget, SLOT(setEnabled(bool)));
++ //dw->boxLayout()->addWidget(layerWidget);
++ dw->setWidget(layerWidget);
++ dw->setFixedExtentWidth(120);
++ //dw->setFixedExtentHeight(400);
++ //dw->setFixedHeight(400);
++ dw->setResizeEnabled(true);
++ dw->setCaption(tr("Layer List"));
++ dw->setCloseMode(QDockWindow::Always);
++ //dw->resize(120,workspace->height()/2);
++ addDockWindow(dw, DockRight);
++ layerDockWindow = dw;
++
++ RS_DEBUG->print(" block widget..");
++ dw = new QDockWindow(QDockWindow::InDock, this, "Block");
++ dw->setResizeEnabled(true);
++ blockWidget = new QG_BlockWidget(actionHandler, dw, "Block");
++ blockWidget->setFocusPolicy(QWidget::NoFocus);
++ connect(blockWidget, SIGNAL(escape()),
++ this, SLOT(slotFocus()));
++ connect(this, SIGNAL(windowsChanged(bool)),
++ blockWidget, SLOT(setEnabled(bool)));
++ //dw->boxLayout()->addWidget(blockWidget);
++ dw->setWidget(blockWidget);
++ dw->setFixedExtentWidth(120);
++ dw->setCaption(tr("Block List"));
++ dw->setCloseMode(QDockWindow::Always);
++ //dw->setFixedExtentHeight(400);
++ addDockWindow(dw, DockRight);
++ blockDockWindow = dw;
++
++ RS_DEBUG->print(" library widget..");
++ dw = new QDockWindow(QDockWindow::OutsideDock, this, "Library");
++ libraryWidget = new QG_LibraryWidget(dw, "Library");
++ libraryWidget->setActionHandler(actionHandler);
++ libraryWidget->setFocusPolicy(QWidget::NoFocus);
++ connect(libraryWidget, SIGNAL(escape()),
++ this, SLOT(slotFocus()));
++ connect(this, SIGNAL(windowsChanged(bool)),
++ (QObject*)libraryWidget->bInsert, SLOT(setEnabled(bool)));
++ dw->setWidget(libraryWidget);
++ //dw->setFixedExtentWidth(240);
++ //dw->setHeight(400);
++ dw->resize(240, 400);
++ dw->setResizeEnabled(true);
++ dw->setCaption(tr("Library Browser"));
++ dw->setCloseMode(QDockWindow::Always);
++ addDockWindow(dw, DockTornOff);
++ libraryDockWindow = dw;
++ libraryDockWindow->hide();
++
++ RS_DEBUG->print(" command widget..");
++ dw = new QDockWindow(QDockWindow::InDock, this, "Command");
++ dw->setResizeEnabled(true);
++ commandWidget = new QG_CommandWidget(dw, "Command");
++ commandWidget->setActionHandler(actionHandler);
++ //commandWidget->redirectStderr();
++ //std::cerr << "Ready.\n";
++ //commandWidget->processStderr();
++ connect(this, SIGNAL(windowsChanged(bool)),
++ commandWidget, SLOT(setEnabled(bool)));
++ //connect(commandWidget, SIGNAL(escape()),
++ // this, SLOT(slotFocus()));
++ //commandWidget->grabKeyboard();
++ //dw->boxLayout()->addWidget(commandWidget);
++ dw->setWidget(commandWidget);
++ //dw->setFixedExtentWidth(120);
++ dw->setFixedExtentHeight(45);
++ dw->setCaption(tr("Command line"));
++ dw->setCloseMode(QDockWindow::Always);
++ commandDockWindow = dw;
++ addDockWindow(dw, DockBottom);
++
++
++#endif
++
++ RS_DEBUG->print(" done");
++}
++
++
++
++/**
++ * Creates a new toolbar.
++ * Implementation from QG_MainWindowInterface.
++ * Can be called from scripts to add individual GUI elements.
++ */
++/*QToolBar* QC_ApplicationWindow::createToolBar(const RS_String& name) {
++ QToolBar* tb = new QToolBar(this, name);
++ tb->setLabel(name);
++ return tb;
++}*/
++
++
++
++/**
++ * Creates a new button in the given tool bar for running a script.
++ */
++/*void QC_ApplicationWindow::addToolBarButton(QToolBar* tb) {
++ if (tb!=NULL) {
++ QAction* action = new QAction("Blah",
++ QPixmap::fromMimeSource("zoomwindow.png"),
++ "&Blah", QKeySequence(), NULL);
++ action->setStatusTip("Blah blah");
++ action->addTo(tb);
++ }
++}*/
++
++
++
++/**
++ * Updates the recent file list in the file menu.
++ */
++void QC_ApplicationWindow::updateRecentFilesMenu() {
++ RS_DEBUG->print("QC_ApplicationWindow::updateRecentFilesMenu()");
++
++ RS_DEBUG->print("Updating recent file menu...");
++ for (int i=0; i<recentFiles->getNumber(); ++i) {
++ QString label = QString( "&%1 %2" ).
++ arg(i+1).arg(recentFiles->get(i));
++
++ if (fileMenu->findItem(i)) {
++ RS_DEBUG->print("Changeing item %d", i);
++ fileMenu->changeItem(i, label);
++ } else if (i < int(recentFiles->count())) {
++ RS_DEBUG->print("Adding item %d", i);
++ fileMenu->insertItem(label,
++ this, SLOT(slotFileOpenRecent(int)),
++ 0, i);
++ }
++ }
++}
++
++
++
++/**
++ * Goes back to the previous menu or one step in the current action.
++ */
++void QC_ApplicationWindow::slotBack() {
++ RS_GraphicView* graphicView = getGraphicView();
++ if (graphicView!=NULL) {
++ graphicView->back();
++ } else {
++ if (cadToolBar!=NULL) {
++ cadToolBar->showToolBar(RS2::ToolBarMain);
++ }
++ }
++}
++
++
++
++/**
++ * Goes one step further in the current action.
++ */
++void QC_ApplicationWindow::slotEnter() {
++
++ if (commandWidget==NULL || !commandWidget->checkFocus()) {
++ if (cadToolBar!=NULL) {
++ cadToolBar->forceNext();
++ } else {
++ RS_GraphicView* graphicView = getGraphicView();
++ if (graphicView!=NULL) {
++ graphicView->enter();
++ }
++ }
++ }
++}
++
++
++
++/**
++ * Sets the keyboard focus on the command line.
++ */
++void QC_ApplicationWindow::slotFocusCommandLine() {
++ if (commandWidget->isVisible()) {
++ commandWidget->setFocus();
++ }
++}
++
++
++/**
++ * Shows the given error on the command line.
++ */
++void QC_ApplicationWindow::slotError(const QString& msg) {
++ commandWidget->appendHistory(msg);
++}
++
++
++
++/**
++ * Hands focus back to the application window. In the rare event
++ * of a escape press from the layer widget (e.g after switching desktops
++ * in XP).
++ */
++void QC_ApplicationWindow::slotFocus() {
++ //QG_GraphicView* graphicView = getGraphicView();
++ /*if (graphicView!=NULL) {
++ graphicView->setFocus();
++}
++ else {*/
++ setFocus();
++ //}
++}
++
++
++/**
++ * Called when a document window was activated.
++ */
++void QC_ApplicationWindow::slotWindowActivated(QWidget*) {
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotWindowActivated begin");
++
++ QC_MDIWindow* m = getMDIWindow();
++
++ if (m!=NULL && m->getDocument()!=NULL) {
++ //m->setWindowState(WindowMaximized);
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotWindowActivated: "
++ "document: %d", m->getDocument()->getId());
++
++ bool showByBlock = m->getDocument()->rtti()==RS2::EntityBlock;
++
++ layerWidget->setLayerList(m->getDocument()->getLayerList(),
++ showByBlock);
++
++
++ coordinateWidget->setGraphic(m->getGraphic());
++
++#ifdef RS_CAM
++
++ simulationControls->setGraphicView(m->getGraphicView());
++#endif
++
++ // Only graphics show blocks. (blocks don't)
++ if (m->getDocument()->rtti()==RS2::EntityGraphic) {
++ blockWidget->setBlockList(m->getDocument()->getBlockList());
++ } else {
++ blockWidget->setBlockList(NULL);
++ }
++
++ // Update all inserts in this graphic (blocks might have changed):
++ m->getDocument()->updateInserts();
++ m->getGraphicView()->redraw();
++
++ // set snapmode from snapping menu
++ actionHandler->updateSnapMode();
++
++ // set pen from pen toolbar
++ slotPenChanged(penToolBar->getPen());
++
++ // update toggle button status:
++ if (m->getGraphic()!=NULL) {
++ emit(gridChanged(m->getGraphic()->isGridOn()));
++ emit(printPreviewChanged(m->getGraphicView()->isPrintPreview()));
++ }
++ }
++
++ // Disable/Enable menu and toolbar items
++ emit windowsChanged(m!=NULL && m->getDocument()!=NULL);
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotWindowActivated end");
++}
++
++
++
++/**
++ * Called when the menu 'windows' is about to be shown.
++ * This is used to update the window list in the menu.
++ */
++void QC_ApplicationWindow::slotWindowsMenuAboutToShow() {
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotWindowsMenuAboutToShow");
++
++ windowsMenu->clear();
++ int cascadeId = windowsMenu->insertItem(tr("&Cascade"),
++ workspace, SLOT(cascade()));
++ int tileId = windowsMenu->insertItem(tr("&Tile"),
++ this, SLOT(slotTileVertical()));
++ int horTileId = windowsMenu->insertItem(tr("Tile &Horizontally"),
++ this, SLOT(slotTileHorizontal()));
++ if (workspace->windowList().isEmpty()) {
++ windowsMenu->setItemEnabled(cascadeId, false);
++ windowsMenu->setItemEnabled(tileId, false);
++ windowsMenu->setItemEnabled(horTileId, false);
++ }
++ windowsMenu->insertSeparator();
++ QWidgetList windows = workspace->windowList();
++ for (int i=0; i<int(windows.count()); ++i) {
++ int id = windowsMenu->insertItem(windows.at(i)->caption(),
++ this, SLOT(slotWindowsMenuActivated(int)));
++ windowsMenu->setItemParameter(id, i);
++ windowsMenu->setItemChecked(id, workspace->activeWindow()==windows.at(i));
++ }
++}
++
++
++
++/**
++ * Called when the user selects a document window from the
++ * window list.
++ */
++void QC_ApplicationWindow::slotWindowsMenuActivated(int id) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotWindowsMenuActivated");
++
++ QWidget* w = workspace->windowList().at(id);
++ if (w!=NULL) {
++ w->showNormal();
++ //w->setFocus();
++ }
++}
++
++
++
++/**
++ * Tiles MDI windows horizontally.
++ */
++void QC_ApplicationWindow::slotTileHorizontal() {
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotTileHorizontal");
++
++ // primitive horizontal tiling
++ QWidgetList windows = workspace->windowList();
++ if (windows.count()==0) {
++ return;
++ }
++
++ int heightForEach = workspace->height() / windows.count();
++ int y = 0;
++ for (int i=0; i<int(windows.count()); ++i) {
++ QWidget *window = windows.at(i);
++ if (window->testWState(WState_Maximized)) {
++ // prevent flicker
++ window->hide();
++ window->showNormal();
++ }
++ int preferredHeight = window->minimumHeight()
++ + window->parentWidget()->baseSize().height();
++ int actHeight = QMAX(heightForEach, preferredHeight);
++
++ //window->parentWidget()->resize(workspace->width(), actHeight);
++ window->parentWidget()->setGeometry(0, y,
++ workspace->width(), actHeight);
++ y+=actHeight;
++ }
++}
++
++
++
++/**
++ * Tiles MDI windows vertically.
++ */
++void QC_ApplicationWindow::slotTileVertical() {
++ workspace->tile();
++
++ /*
++ QWidgetList windows = workspace->windowList();
++ if (windows.count()==0) {
++ return;
++ }
++
++ //int heightForEach = workspace->height() / windows.count();
++ //int y = 0;
++ for (int i=0; i<int(windows.count()); ++i) {
++ QWidget *window = windows.at(i);
++ if (window->testWState(WState_Maximized)) {
++ // prevent flicker
++ window->hide();
++ window->showNormal();
++ }
++ //int preferredHeight = window->minimumHeight()
++ // + window->parentWidget()->baseSize().height();
++ //int actHeight = QMAX(heightForEach, preferredHeight);
++
++ //window->parentWidget()->setGeometry(0, y,
++ // workspace->width(), actHeight);
++ //window->parentWidget()->resize(window->parentWidget()->width(),
++ // window->parentWidget()->height());
++ //window->resize(window->width(), window->height());
++ //y+=actHeight;
++ }
++ */
++}
++
++
++
++/**
++ * CAM
++ */
++/*
++#ifdef RS_CAM
++void QC_ApplicationWindow::slotCamExportAuto() {
++ printf("CAM export..\n");
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++
++ RS_CamDialog dlg(graphic, this);
++ dlg.exec();
++ }
++}
++#endif
++*/
++
++
++
++/**
++ * Called when something changed in the pen tool bar
++ * (e.g. color, width, style).
++ */
++void QC_ApplicationWindow::slotPenChanged(RS_Pen pen) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotPenChanged() begin");
++
++ RS_DEBUG->print("Setting active pen...");
++
++ QC_MDIWindow* m = getMDIWindow();
++ if (m!=NULL) {
++ m->slotPenChanged(pen);
++ }
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotPenChanged() end");
++}
++
++
++
++/**
++ * Creates a new MDI window with the given document or a new
++ * document if 'doc' is NULL.
++ */
++QC_MDIWindow* QC_ApplicationWindow::slotFileNew(RS_Document* doc) {
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileNew() begin");
++
++ static int id = 0;
++ id++;
++
++ statusBar()->message(tr("Creating new file..."));
++
++ RS_DEBUG->print(" creating MDI window");
++ QC_MDIWindow* w = new QC_MDIWindow(doc, workspace,
++ 0, WDestructiveClose);
++ //w->setWindowState(WindowMaximized);
++ connect(w, SIGNAL(signalClosing()),
++ this, SLOT(slotFileClosing()));
++
++ if (w->getDocument()->rtti()==RS2::EntityBlock) {
++ w->setCaption(tr("Block '%1'").arg(((RS_Block*)(w->getDocument()))->getName()));
++ } else {
++ w->setCaption(tr("unnamed document %1").arg(id));
++ }
++ w->setIcon(QPixmap::fromMimeSource("document.png"));
++
++ // only graphics offer block lists, blocks don't
++ RS_DEBUG->print(" adding listeners");
++ RS_Graphic* graphic = w->getDocument()->getGraphic();
++ if (graphic!=NULL) {
++ // Link the graphic's layer list to the pen tool bar
++ graphic->addLayerListListener(penToolBar);
++ // Link the layer list to the layer widget
++ graphic->addLayerListListener(layerWidget);
++
++ // Link the block list to the block widget
++ graphic->addBlockListListener(blockWidget);
++ }
++
++ // Link the dialog factory to the mouse widget:
++ QG_DIALOGFACTORY->setMouseWidget(mouseWidget);
++ // Link the dialog factory to the coordinate widget:
++ QG_DIALOGFACTORY->setCoordinateWidget(coordinateWidget);
++ QG_DIALOGFACTORY->setSelectionWidget(selectionWidget);
++ // Link the dialog factory to the option widget:
++ //QG_DIALOGFACTORY->setOptionWidget(optionWidget);
++ // Link the dialog factory to the cad tool bar:
++ QG_DIALOGFACTORY->setCadToolBar(cadToolBar);
++ // Link the dialog factory to the command widget:
++ QG_DIALOGFACTORY->setCommandWidget(commandWidget);
++ // Link the dialog factory to the main app window:
++ QG_DIALOGFACTORY->setMainWindow(this);
++
++ RS_DEBUG->print(" showing MDI window");
++ if (workspace->windowList().isEmpty()) {
++ w->showMaximized();
++ } else {
++ w->show();
++ }
++ slotWindowActivated(w);
++ statusBar()->message(tr("New Drawing created."), 2000);
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileNew() OK");
++ setFocus();
++
++ return w;
++}
++
++
++
++/**
++ * Menu file -> open.
++ */
++void QC_ApplicationWindow::slotFileOpen() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen()");
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen() 001");
++ RS2::FormatType type = RS2::FormatUnknown;
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen() 002");
++ QString fileName = QG_FileDialog::getOpenFileName(this, &type);
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen() 003");
++ slotFileOpen(fileName, type);
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen(): OK");
++}
++
++
++
++/**
++ * Called when a recently opened file is chosen from the list in the
++ * file menu.
++ */
++void QC_ApplicationWindow::slotFileOpenRecent(int id) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpenRecent()");
++
++ statusBar()->message(tr("Opening recent file..."));
++ QString fileName = recentFiles->get(id);
++
++ if (fileName.endsWith(" (DXF 1)")) {
++ slotFileOpen(fileName.left(fileName.length()-8), RS2::FormatDXF1);
++ } else {
++ slotFileOpen(fileName, RS2::FormatUnknown);
++ }
++}
++
++
++
++/**
++ * Menu file -> open.
++ */
++void QC_ApplicationWindow::slotFileOpen(const QString& fileName,
++ RS2::FormatType type) {
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen(..)");
++
++ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
++ if (!fileName.isEmpty()) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: creating new doc window");
++ // Create new document window:
++ QC_MDIWindow* w = slotFileNew();
++ RS_APP->processEvents(1000);
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: linking layer list");
++ // link the layer widget to the new document:
++ layerWidget->setLayerList(w->getDocument()->getLayerList(), false);
++ // link the block widget to the new document:
++ blockWidget->setBlockList(w->getDocument()->getBlockList());
++ // link coordinate widget to graphic
++ coordinateWidget->setGraphic(w->getGraphic());
++#ifdef RS_CAM
++ // link the layer widget to the new document:
++ simulationControls->setGraphicView(w->getGraphicView());
++#endif
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: open file");
++
++ RS_APP->processEvents(1000);
++
++ // open the file in the new view:
++ if (w->slotFileOpen(fileName, type)==false) {
++ // error
++ QApplication::restoreOverrideCursor();
++ QMessageBox::information(this, QMessageBox::tr("Warning"),
++ tr("Cannot open the file\n%1\nPlease "
++ "check the permissions.")
++ .arg(fileName),
++ QMessageBox::Ok);
++ w->setForceClosing(true);
++ w->close();
++ return;
++ }
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: open file: OK");
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: update recent file menu: 1");
++
++ // update recent files menu:
++ if (type==RS2::FormatDXF1) {
++ recentFiles->add(fileName + " (DXF 1)");
++ } else {
++ recentFiles->add(fileName);
++ }
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: update recent file menu: 2");
++ updateRecentFilesMenu();
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: update recent file menu: OK");
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: set caption");
++ // update caption:
++ w->setCaption(fileName);
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: set caption: OK");
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: update coordinate widget");
++ // update coordinate widget format:
++ RS_DIALOGFACTORY->updateCoordinateWidget(RS_Vector(0.0,0.0),
++ RS_Vector(0.0,0.0),
++ true);
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen: update coordinate widget: OK");
++
++ // show output of filter (if any):
++ commandWidget->processStderr();
++ QString message=tr("Loaded document: ")+fileName;
++ commandWidget->appendHistory(message);
++ statusBar()->message(message, 2000);
++ } else {
++ statusBar()->message(tr("Opening aborted"), 2000);
++ }
++ QApplication::restoreOverrideCursor();
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileOpen(..) OK");
++}
++
++
++
++/**
++ * Menu file -> save.
++ */
++void QC_ApplicationWindow::slotFileSave() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileSave()");
++
++ statusBar()->message(tr("Saving drawing..."));
++
++ QC_MDIWindow* w = getMDIWindow();
++ QString name;
++ if (w!=NULL) {
++ if (w->getDocument()->getFilename().isEmpty()) {
++ slotFileSaveAs();
++ } else {
++ bool cancelled;
++ if (w->slotFileSave(cancelled)) {
++ if (!cancelled) {
++ name = w->getDocument()->getFilename();
++ statusBar()->message(tr("Saved drawing: %1").arg(name), 2000);
++ }
++ } else {
++ // error
++ QMessageBox::information(this, QMessageBox::tr("Warning"),
++ tr("Cannot save the file\n%1\nPlease "
++ "check the permissions.")
++ .arg(w->getDocument()->getFilename()),
++ QMessageBox::Ok);
++ }
++ }
++ }
++}
++
++
++
++/**
++ * Menu file -> save as.
++ */
++void QC_ApplicationWindow::slotFileSaveAs() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileSaveAs()");
++
++ statusBar()->message(tr("Saving drawing under new filename..."));
++
++ QC_MDIWindow* w = getMDIWindow();
++ QString name;
++ if (w!=NULL) {
++ bool cancelled;
++ if (w->slotFileSaveAs(cancelled)) {
++ if (!cancelled) {
++ name = w->getDocument()->getFilename();
++ recentFiles->add(name);
++ w->setCaption(name);
++ }
++ } else {
++ // error
++ QMessageBox::information(this, QMessageBox::tr("Warning"),
++ tr("Cannot save the file\n%1\nPlease "
++ "check the permissions.")
++ .arg(w->getDocument()->getFilename()),
++ QMessageBox::Ok);
++ }
++ }
++ updateRecentFilesMenu();
++
++ QString message = tr("Saved drawing: %1").arg(name);
++ statusBar()->message(message, 2000);
++ commandWidget->appendHistory(message);
++}
++
++
++
++/**
++ * Menu file -> export.
++ */
++void QC_ApplicationWindow::slotFileExport() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileExport()");
++
++ statusBar()->message(tr("Exporting drawing..."));
++
++ QC_MDIWindow* w = getMDIWindow();
++ QString fn;
++ if (w!=NULL) {
++
++ // read default settings:
++ RS_SETTINGS->beginGroup("/Paths");
++ RS_String defDir = RS_SETTINGS->readEntry("/ExportImage",
++ RS_SYSTEM->getHomeDir());
++ RS_String defFilter = RS_SETTINGS->readEntry("/ExportImageFilter",
++ "Portable Network Graphic (*.png)");
++ RS_SETTINGS->endGroup();
++
++ bool cancel = false;
++
++ QFileDialog fileDlg(NULL, "", true);
++
++ QStrList f = QImageIO::outputFormats();
++ QStringList formats = QStringList::fromStrList(f);
++ QStringList filters;
++ //QString all = "";
++
++ for (QStringList::Iterator it = formats.begin();
++ it!=formats.end(); ++it) {
++
++ QString st;
++ if ((*it)=="JPEG") {
++ st = QString("%1 (*.%2 *.jpg)")
++ .arg(QG_DialogFactory::extToFormat(*it))
++ .arg(QString(*it).lower());
++ } else {
++ st = QString("%1 (*.%2)")
++ .arg(QG_DialogFactory::extToFormat(*it))
++ .arg(QString(*it).lower());
++ }
++ filters.append(st);
++
++ //if (!all.isEmpty()) {
++ // all += " ";
++ //}
++ //all += QString("*.%1").arg(QString(*it).lower());
++ }
++
++ fileDlg.setFilters(filters);
++ fileDlg.setMode(QFileDialog::AnyFile);
++ fileDlg.setCaption(QObject::tr("Export Image"));
++ fileDlg.setDir(defDir);
++ fileDlg.setSelectedFilter(defFilter);
++
++ if (fileDlg.exec()==QDialog::Accepted) {
++ fn = fileDlg.selectedFile();
++ cancel = false;
++ } else {
++ cancel = true;
++ }
++
++ // store new default settings:
++ if (!cancel) {
++ RS_SETTINGS->beginGroup("/Paths");
++ RS_SETTINGS->writeEntry("/ExportImage", QFileInfo(fn).dirPath(true));
++ RS_SETTINGS->writeEntry("/ExportImageFilter",
++ fileDlg.selectedFilter());
++ RS_SETTINGS->endGroup();
++
++ // find out extension:
++ QString filter = fileDlg.selectedFilter();
++ QString format = "";
++ int i = filter.find("(*.");
++ if (i!=-1) {
++ int i2 = filter.find(QRegExp("[) ]"), i);
++ format = filter.mid(i+3, i2-(i+3));
++ format = format.upper();
++ }
++
++ // append extension to file:
++ if (!QFileInfo(fn).fileName().contains(".")) {
++ fn.append("." + format.lower());
++ }
++
++ // show options dialog:
++ QG_ImageOptionsDialog dlg(this);
++ dlg.setGraphicSize(w->getGraphic()->getSize());
++ if (dlg.exec()) {
++ bool ret = slotFileExport(fn, format, dlg.getSize(),
++ dlg.isBackgroundBlack());
++ if (ret) {
++ QString message = tr("Exported: %1").arg(fn);
++ statusBar()->message(message, 2000);
++ commandWidget->appendHistory(message);
++ }
++ }
++ }
++ }
++
++}
++
++
++
++/**
++ * Exports the drawing as a bitmap.
++ *
++ * @param name File name.
++ * @param format File format (e.g. "png")
++ * @param size Size of the bitmap in pixel
++ * @param black true: Black background, false: white
++ * @param bw true: black/white export, false: color
++ */
++bool QC_ApplicationWindow::slotFileExport(const QString& name,
++ const QString& format, QSize size, bool black, bool bw) {
++
++ QC_MDIWindow* w = getMDIWindow();
++ if (w==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotFileExport: "
++ "no window opened");
++ return false;
++ }
++
++ RS_Graphic* graphic = w->getDocument()->getGraphic();
++ if (graphic==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotFileExport: "
++ "no graphic");
++ return false;
++ }
++
++ statusBar()->message(tr("Exporting..."));
++ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
++
++ bool ret = false;
++ QPixmap* buffer = new QPixmap(size);
++ RS_PainterQt* painter = new RS_PainterQt(buffer);
++
++ // black background:
++ if (black) {
++ painter->setBackgroundColor(RS_Color(0,0,0));
++ }
++ // white background:
++ else {
++ painter->setBackgroundColor(RS_Color(255,255,255));
++ }
++
++ // black/white:
++ if (bw) {
++ painter->setDrawingMode(RS2::ModeBW);
++ }
++
++ painter->eraseRect(0,0, size.width(), size.height());
++
++ RS_StaticGraphicView gv(size.width(), size.height(), painter);
++ if (black) {
++ gv.setBackground(RS_Color(0,0,0));
++ } else {
++ gv.setBackground(RS_Color(255,255,255));
++ }
++ gv.setContainer(graphic);
++ gv.zoomAuto(false);
++ gv.drawEntity(graphic, true);
++
++ QImageIO iio;
++ QImage img;
++ img = *buffer;
++ iio.setImage(img);
++ iio.setFileName(name);
++ iio.setFormat(format);
++ if (iio.write()) {
++ ret = true;
++ }
++ QApplication::restoreOverrideCursor();
++
++ // GraphicView deletes painter
++ painter->end();
++ delete buffer;
++
++ if (ret) {
++ statusBar()->message(tr("Export complete"), 2000);
++ } else {
++ statusBar()->message(tr("Export failed!"), 2000);
++ }
++
++ return ret;
++}
++
++
++/**
++ * Menu file -> close.
++ */
++void QC_ApplicationWindow::slotFileClose() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileClose()");
++
++ QC_MDIWindow* m = getMDIWindow();
++ if (m!=NULL) {
++ m->close(true);
++ }
++
++ /*
++ m = getMDIWindow();
++ if (m!=NULL) {
++ //m->showMaximized();
++ m->setWindowState(WindowMaximized);
++ }
++ */
++}
++
++
++
++/**
++ * Called when a MDI window is actually about to close. Used to
++ * detach widgets from the document.
++ */
++void QC_ApplicationWindow::slotFileClosing() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileClosing()");
++
++ RS_DEBUG->print("detaching lists");
++ layerWidget->setLayerList(NULL, false);
++ blockWidget->setBlockList(NULL);
++ coordinateWidget->setGraphic(NULL);
++#ifdef RS_CAM
++
++ simulationControls->setGraphicView(NULL);
++#endif
++}
++
++
++
++/**
++ * Menu file -> print.
++ */
++void QC_ApplicationWindow::slotFilePrint() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrint()");
++
++ QC_MDIWindow* w = getMDIWindow();
++ if (w==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotFilePrint: "
++ "no window opened");
++ return;
++ }
++
++ RS_Graphic* graphic = w->getDocument()->getGraphic();
++ if (graphic==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotFilePrint: "
++ "no graphic");
++ return;
++ }
++
++ statusBar()->message(tr("Printing..."));
++ QPrinter* printer;
++ printer = new QPrinter(QPrinter::HighResolution);
++ bool landscape = false;
++ printer->setPageSize(RS2::rsToQtPaperFormat(graphic->getPaperFormat(&landscape)));
++ if (landscape) {
++ printer->setOrientation(QPrinter::Landscape);
++ } else {
++ printer->setOrientation(QPrinter::Portrait);
++ }
++
++ RS_SETTINGS->beginGroup("/Print");
++ printer->setOutputFileName(RS_SETTINGS->readEntry("/FileName", ""));
++ printer->setColorMode((QPrinter::ColorMode)RS_SETTINGS->readNumEntry("/ColorMode", (int)QPrinter::Color));
++ printer->setOutputToFile((bool)RS_SETTINGS->readNumEntry("/PrintToFile",
++ 0));
++ RS_SETTINGS->endGroup();
++
++ // printer setup:
++ if (printer->setup(this)) {
++ //printer->setOutputToFile(true);
++ //printer->setOutputFileName(outputFile);
++
++ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
++ printer->setFullPage(true);
++ QPaintDeviceMetrics metr(printer);
++
++ RS_PainterQt* painter = new RS_PainterQt(printer);
++ painter->setDrawingMode(w->getGraphicView()->getDrawingMode());
++
++ RS_StaticGraphicView gv(metr.width(), metr.height(), painter);
++ gv.setPrinting(true);
++ gv.setBorders(0,0,0,0);
++
++ double fx = (double)metr.width() / metr.widthMM()
++ * RS_Units::getFactorToMM(graphic->getUnit());
++ double fy = (double)metr.height() / metr.heightMM()
++ * RS_Units::getFactorToMM(graphic->getUnit());
++
++ double f = (fx+fy)/2;
++
++ double scale = graphic->getPaperScale();
++
++ gv.setOffset((int)(graphic->getPaperInsertionBase().x * f),
++ (int)(graphic->getPaperInsertionBase().y * f));
++ gv.setFactor(f*scale);
++
++ gv.setContainer(graphic);
++
++ gv.drawEntity(graphic, true);
++
++ // GraphicView deletes painter
++ painter->end();
++
++ RS_SETTINGS->beginGroup("/Print");
++ RS_SETTINGS->writeEntry("/PrintToFile", (int)printer->outputToFile());
++ RS_SETTINGS->writeEntry("/ColorMode", (int)printer->colorMode());
++ RS_SETTINGS->writeEntry("/FileName", printer->outputFileName());
++ RS_SETTINGS->endGroup();
++ QApplication::restoreOverrideCursor();
++ }
++
++ delete printer;
++
++ statusBar()->message(tr("Printing complete"), 2000);
++}
++
++
++
++/**
++ * Menu file -> print preview.
++ */
++void QC_ApplicationWindow::slotFilePrintPreview(bool on) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrintPreview()");
++
++ RS_DEBUG->print(" creating MDI window");
++ QC_MDIWindow* parent = getMDIWindow();
++ if (parent==NULL) {
++ RS_DEBUG->print(RS_Debug::D_WARNING,
++ "QC_ApplicationWindow::slotFilePrintPreview: "
++ "no window opened");
++ return;
++ }
++
++ // close print preview:
++ if (!on) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrintPreview(): off");
++ if (parent->getGraphicView()->isPrintPreview()) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrintPreview(): close");
++ slotFileClose();
++ }
++ }
++
++ // open print preview:
++ else {
++ // look for an existing print preview:
++ QC_MDIWindow* ppv = parent->getPrintPreview();
++ if (ppv!=NULL) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrintPreview(): show existing");
++ slotWindowActivated(ppv);
++ ppv->showNormal();
++ } else {
++ if (!parent->getGraphicView()->isPrintPreview()) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFilePrintPreview(): create");
++
++ QC_MDIWindow* w = new QC_MDIWindow(parent->getDocument(), workspace,
++ 0, WDestructiveClose);
++ parent->addChildWindow(w);
++ //connect(w, SIGNAL(signalClosing()),
++ // this, SLOT(slotFileClosing()));
++
++ w->setCaption(tr("Print preview for %1").arg(parent->caption()));
++ w->setIcon(QPixmap::fromMimeSource("document.png"));
++ w->getGraphicView()->setPrintPreview(true);
++ w->getGraphicView()->setBackground(RS_Color(255,255,255));
++ w->getGraphicView()->setDefaultAction(
++ new RS_ActionPrintPreview(*w->getDocument(), *w->getGraphicView()));
++
++ // only graphics offer block lists, blocks don't
++ RS_DEBUG->print(" adding listeners");
++ RS_Graphic* graphic = w->getDocument()->getGraphic();
++ if (graphic!=NULL) {
++ // Link the layer list to the pen tool bar
++ graphic->addLayerListListener(penToolBar);
++ // Link the layer list to the layer widget
++ graphic->addLayerListListener(layerWidget);
++
++ // Link the block list to the block widget
++ graphic->addBlockListListener(blockWidget);
++
++ // Center by default:
++ graphic->centerToPage();
++ }
++
++ // Link the graphic view to the mouse widget:
++ QG_DIALOGFACTORY->setMouseWidget(mouseWidget);
++ // Link the graphic view to the coordinate widget:
++ QG_DIALOGFACTORY->setCoordinateWidget(coordinateWidget);
++ QG_DIALOGFACTORY->setSelectionWidget(selectionWidget);
++ // Link the graphic view to the option widget:
++ //QG_DIALOGFACTORY->setOptionWidget(optionWidget);
++ // Link the graphic view to the cad tool bar:
++ QG_DIALOGFACTORY->setCadToolBar(cadToolBar);
++ // Link the graphic view to the command widget:
++ QG_DIALOGFACTORY->setCommandWidget(commandWidget);
++
++ RS_DEBUG->print(" showing MDI window");
++
++ if (workspace->windowList().isEmpty()) {
++ w->showMaximized();
++ } else {
++ w->show();
++ }
++ w->getGraphicView()->zoomPage();
++ setFocus();
++
++ slotWindowActivated(w);
++ }
++ }
++ }
++}
++
++
++
++/**
++ * Menu file -> quit.
++ */
++void QC_ApplicationWindow::slotFileQuit() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotFileQuit()");
++
++ statusBar()->message(tr("Exiting application..."));
++
++ if (queryExit(false)) {
++ qApp->exit(0);
++ }
++}
++
++
++/**
++ * Forces termination of QCad (demo version).
++ */
++void QC_ApplicationWindow::slotFileDemoQuit() {
++
++ statusBar()->message(tr("Exiting application..."));
++
++ queryExit(true);
++ qApp->exit(0);
++}
++
++
++
++/**
++ * Shows / hides the grid.
++ *
++ * @param toggle true: show, false: hide.
++ */
++void QC_ApplicationWindow::slotViewGrid(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewGrid()");
++
++ QC_MDIWindow* m = getMDIWindow();
++ if (m!=NULL) {
++ RS_Graphic* g = m->getGraphic();
++ if (g!=NULL) {
++ g->setGridOn(toggle);
++ }
++ }
++
++ updateGrids();
++ redrawAll();
++
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewGrid() OK");
++}
++
++
++
++/**
++ * Enables / disables the draft mode.
++ *
++ * @param toggle true: enable, false: disable.
++ */
++void QC_ApplicationWindow::slotViewDraft(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewDraft()");
++
++ /*QC_MDIWindow* m = getMDIWindow();
++ if (m!=NULL) {
++ RS_Graphic* g = m->getGraphic();
++ if (g!=NULL) {
++ g->setDraftOn(toggle);
++ }
++}*/
++
++ RS_SETTINGS->beginGroup("/Appearance");
++ RS_SETTINGS->writeEntry("/DraftMode", (int)toggle);
++ RS_SETTINGS->endGroup();
++
++ redrawAll();
++}
++
++
++
++/**
++ * Redraws all mdi windows.
++ */
++void QC_ApplicationWindow::redrawAll() {
++ if (workspace!=NULL) {
++ QWidgetList windows = workspace->windowList();
++ for (int i = 0; i < int(windows.count()); ++i) {
++ QC_MDIWindow* m = (QC_MDIWindow*)windows.at(i);
++ if (m!=NULL) {
++ QG_GraphicView* gv = m->getGraphicView();
++ if (gv!=NULL) {
++ gv->redraw();
++ }
++ }
++ }
++ }
++}
++
++
++
++/**
++ * Updates all grids of all graphic views.
++ */
++void QC_ApplicationWindow::updateGrids() {
++ if (workspace!=NULL) {
++ QWidgetList windows = workspace->windowList();
++ for (int i = 0; i < int(windows.count()); ++i) {
++ QC_MDIWindow* m = (QC_MDIWindow*)windows.at(i);
++ if (m!=NULL) {
++ QG_GraphicView* gv = m->getGraphicView();
++ if (gv!=NULL) {
++ gv->updateGrid();
++ }
++ }
++ }
++ }
++}
++
++
++
++/**
++ * Shows / hides the status bar.
++ *
++ * @param toggle true: show, false: hide.
++ */
++void QC_ApplicationWindow::slotViewStatusBar(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewStatusBar()");
++
++ if (toggle==false) {
++ statusBar()->hide();
++ } else {
++ statusBar()->show();
++ }
++}
++
++
++
++/**
++ * Shows / hides the layer list.
++ *
++ * @param toggle true: show, false: hide.
++ */
++/*void QC_ApplicationWindow::slotViewLayerList(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewLayerList()");
++
++ if (toggle==false) {
++ layerDockWindow->hide();
++ } else {
++ layerDockWindow->show();
++ }
++}
++*/
++
++
++/**
++ * Shows / hides the block list.
++ *
++ * @param toggle true: show, false: hide.
++ */
++/*
++void QC_ApplicationWindow::slotViewBlockList(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewBlockList()");
++
++ if (toggle==false) {
++ blockDockWindow->hide();
++ } else {
++ blockDockWindow->show();
++ }
++}
++*/
++
++
++
++/**
++ * Shows / hides the command line.
++ *
++ * @param toggle true: show, false: hide.
++ */
++/*
++void QC_ApplicationWindow::slotViewCommandLine(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewCommandLine()");
++
++ if (toggle==false) {
++ commandDockWindow->hide();
++ //QG_GraphicView* graphicView = getGraphicView();
++ //if (graphicView!=NULL) {
++ //graphicView->setFocus();
++ //}
++ setFocus();
++ } else {
++ commandDockWindow->show();
++ }
++}
++*/
++
++
++
++/**
++ * Shows / hides the option toolbar.
++ *
++ * @param toggle true: show, false: hide.
++ */
++/*
++void QC_ApplicationWindow::slotViewOptionToolbar(bool toggle) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotViewOptionToolbar()");
++
++ if (toggle==false) {
++ optionWidget->hide();
++ } else {
++ optionWidget->show();
++ }
++}
++*/
++
++
++/**
++ * Creates a new MDI window for editing the selected block.
++ */
++/*
++void QC_ApplicationWindow::slotBlocksEdit() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotBlocksEdit()");
++
++ QC_MDIWindow* parent = getMDIWindow();
++ if (parent!=NULL) {
++ RS_BlockList* blist = blockWidget->getBlockList();
++ if (blist!=NULL) {
++ RS_Block* blk = blist->getActiveBlock();
++ if (blk!=NULL) {
++ QC_MDIWindow* w = slotFileNew(blk);
++ // the parent needs a pointer to the block window and
++ // vice versa
++ parent->addChildWindow(w);
++ w->getGraphicView()->zoomAuto();
++ }
++ }
++ }
++}
++*/
++
++
++
++/**
++ * Shows the dialog for general application preferences.
++ */
++void QC_ApplicationWindow::slotOptionsGeneral() {
++ RS_DIALOGFACTORY->requestOptionsGeneralDialog();
++
++ // update background color of all open drawings:
++ RS_SETTINGS->beginGroup("/Appearance");
++ QColor color(RS_SETTINGS->readEntry("/BackgroundColor", "#000000"));
++ QColor gridColor(RS_SETTINGS->readEntry("/GridColor", "Gray"));
++ QColor metaGridColor(RS_SETTINGS->readEntry("/MetaGridColor", "Darkgray"));
++ QColor selectedColor(RS_SETTINGS->readEntry("/SelectedColor", "#A54747"));
++ QColor highlightedColor(RS_SETTINGS->readEntry("/HighlightedColor",
++ "#739373"));
++ RS_SETTINGS->endGroup();
++
++ QWidgetList windows = workspace->windowList();
++ for (int i = 0; i < int(windows.count()); ++i) {
++ QC_MDIWindow* m = (QC_MDIWindow*)windows.at(i);
++ if (m!=NULL) {
++ QG_GraphicView* gv = m->getGraphicView();
++ if (gv!=NULL) {
++ gv->setBackground(color);
++ gv->setGridColor(gridColor);
++ gv->setMetaGridColor(metaGridColor);
++ gv->setSelectedColor(selectedColor);
++ gv->setHighlightedColor(highlightedColor);
++ gv->updateGrid();
++ gv->redraw();
++ }
++ }
++ }
++
++}
++
++
++
++/**
++ * Menu script -> show ide
++ */
++void QC_ApplicationWindow::slotScriptOpenIDE() {
++#ifdef RS_SCRIPTING
++ scripter->openIDE();
++#endif
++}
++
++
++
++/**
++ * Menu script -> run
++ */
++void QC_ApplicationWindow::slotScriptRun() {
++#ifdef RS_SCRIPTING
++ scripter->runScript();
++#endif
++}
++
++
++
++/**
++ * Menu help -> about.
++ */
++void QC_ApplicationWindow::slotHelpAbout() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotHelpAbout()");
++
++ QString edition;
++
++#ifdef RS_DEMO
++ //demo; // = " [Demo]";
++#else
++#ifdef RS_PROF
++ edition = " [Professional]";
++#else
++ edition = " [Community Edition]";
++#endif
++#endif
++
++ QStringList modules;
++
++#ifdef RS_CAM
++ modules += "CAM";
++#endif
++
++#ifdef RS_SCRIPTING
++ modules += "Scripting";
++#endif
++
++ QString modulesString;
++
++ if (modules.empty()==false) {
++ modulesString = modules.join(", ");
++ } else {
++ modulesString = tr("None");
++ }
++
++ QMessageBox box(this);
++ box.setCaption(tr("About..."));
++ box.setText( QString("<qt>") + // no center for main stream QCad
++#ifdef QC_ABOUT_HEADER
++ QString("<center>") +
++ QString(QC_ABOUT_HEADER) +
++#else
++ "<h2>"+ QC_APPNAME+ "</h2>" +
++#endif
++ tr("Version: %1 %2").arg(QC_VERSION).arg(edition) + "<br>" +
++ tr("Date: %1").arg(__DATE__) + "<br>" +
++ QString("(c) 2001-2005 by RibbonSoft,<br> Andrew Mustun") +
++ "<br>" +
++ tr("Modules: %1").arg(modulesString) + "<br>" +
++ QString("http://www.ribbonsoft.com")
++#ifdef QC_ABOUT_ADD_COMPANY
++ + QString("<br>") + QC_ABOUT_ADD_COMPANY
++ + QString("</center>")
++#endif
++ );
++#ifndef QC_ABOUT_HEADER
++ box.setIcon( QPixmap::fromMimeSource(QC_APP_ICON) );
++ box.setFixedWidth(340);
++ box.setFixedHeight(250);
++#endif
++ box.exec();
++}
++
++
++
++/**
++ * Menu help -> help.
++ */
++void QC_ApplicationWindow::slotHelpManual() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotHelpManual()");
++
++ if (assistant==NULL) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotHelpManual(): appdir: %s",
++ RS_SYSTEM->getAppDir().latin1());
++ RS_DEBUG->print("QC_ApplicationWindow::slotHelpManual(): appdir: %s",
++ RS_SYSTEM->getAppDir().latin1());
++ assistant = new QAssistantClient(RS_SYSTEM->getAppDir()+"/bin", this);
++ connect(assistant, SIGNAL(error(const QString&)),
++ this, SLOT(slotError(const QString&)));
++ QStringList args;
++ args << "-profile";
++ args << QDir::convertSeparators(RS_SYSTEM->getDocPath() + "/qcaddoc.adp");
++// args << QString("doc") + QDir::separator() + QString("qcaddoc.adp");
++
++#if QT_VERSION>=0x030200
++ assistant->setArguments(args);
++#endif
++ }
++ assistant->openAssistant();
++ //assistant->showPage("index.html");
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestDumpEntities(RS_EntityContainer* d) {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestDumpEntities()");
++ static int level = 0;
++ std::ofstream dumpFile;
++
++ if (d==NULL) {
++ d = getDocument();
++ dumpFile.open("debug_entities.html");
++ level = 0;
++ } else {
++ dumpFile.open("debug_entities.html", std::ios::app);
++ level++;
++ }
++
++ if (d!=NULL) {
++ if (level==0) {
++ dumpFile << "<html>\n";
++ dumpFile << "<body>\n";
++ }
++
++ for (RS_Entity* e=d->firstEntity();
++ e!=NULL;
++ e=d->nextEntity()) {
++
++ dumpFile << "<table border=\"1\">\n";
++ dumpFile << "<tr><td>Entity: " << e->getId()
++ << "</td></tr>\n";
++
++ dumpFile
++ << "<tr><td><table><tr>"
++ << "<td>VIS:" << e->isVisible() << "</td>"
++ << "<td>UND:" << e->isUndone() << "</td>"
++ << "<td>SEL:" << e->isSelected() << "</td>"
++ << "<td>TMP:" << e->getFlag(RS2::FlagTemp) << "</td>";
++ RS_String lay = "NULL";
++ if (e->getLayer()!=NULL) {
++ lay = e->getLayer()->getName();
++ }
++ dumpFile
++ << "<td>Layer: " << lay << "</td>"
++ << "<td>Width: " << (int)e->getPen(false).getWidth() << "</td>"
++ << "<td>Parent: " << e->getParent()->getId() << "</td>"
++ << "</tr></table>";
++
++ dumpFile
++ << "<tr><td>\n";
++
++ switch (e->rtti()) {
++ case RS2::EntityPoint: {
++ RS_Point* p = (RS_Point*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Point:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>"
++ << p->getPos()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityLine: {
++ RS_Line* l = (RS_Line*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Line:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>"
++ << l->getStartpoint()
++ << "</td>"
++ << "<td>"
++ << l->getEndpoint()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityArc: {
++ RS_Arc* a = (RS_Arc*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Arc:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>Center: "
++ << a->getCenter()
++ << "</td>"
++ << "<td>Radius: "
++ << a->getRadius()
++ << "</td>"
++ << "<td>Angle 1: "
++ << a->getAngle1()
++ << "</td>"
++ << "<td>Angle 2: "
++ << a->getAngle2()
++ << "</td>"
++ << "<td>Startpoint: "
++ << a->getStartpoint()
++ << "</td>"
++ << "<td>Endpoint: "
++ << a->getEndpoint()
++ << "</td>"
++ << "<td>reversed: "
++ << (int)a->isReversed()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityCircle: {
++ RS_Circle* c = (RS_Circle*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Circle:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>Center: "
++ << c->getCenter()
++ << "</td>"
++ << "<td>Radius: "
++ << c->getRadius()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityDimAligned: {
++ RS_DimAligned* d = (RS_DimAligned*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Dimension / Aligned:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>"
++ << d->getDefinitionPoint()
++ << "</td>"
++ << "<td>"
++ << d->getExtensionPoint1()
++ << "</td>"
++ << "<td>"
++ << d->getExtensionPoint2()
++ << "</td>"
++ << "<td>Text: "
++ << d->getText().latin1()
++ << "</td>"
++ << "<td>Label: "
++ << d->getLabel().latin1()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityDimLinear: {
++ RS_DimLinear* d = (RS_DimLinear*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Dimension / Linear:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>"
++ << d->getDefinitionPoint()
++ << "</td>"
++ << "<td>"
++ << d->getExtensionPoint1()
++ << "</td>"
++ << "<td>"
++ << d->getExtensionPoint2()
++ << "</td>"
++ << "<td>Text: "
++ << d->getText()
++ << "</td>"
++ << "<td>Label: "
++ << d->getLabel()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityInsert: {
++ RS_Insert* i = (RS_Insert*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Insert:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>Insertion point:"
++ << i->getInsertionPoint()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityText: {
++ RS_Text* t = (RS_Text*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Text:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>Text:"
++ << t->getText().latin1()
++ << "</td>"
++ << "<td>Height:"
++ << t->getHeight()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ case RS2::EntityHatch: {
++ RS_Hatch* h = (RS_Hatch*)e;
++ dumpFile
++ << "<table><tr><td>"
++ << "<b>Hatch:</b>"
++ << "</td></tr>";
++ dumpFile
++ << "<tr>"
++ << "<td>Pattern:"
++ << h->getPattern().latin1()
++ << "</td>"
++ << "<td>Scale:"
++ << h->getScale()
++ << "</td>"
++ << "<td>Solid:"
++ << (int)h->isSolid()
++ << "</td>"
++ << "</tr></table>";
++ }
++ break;
++
++ default:
++ dumpFile
++ << "<tr><td>"
++ << "<b>Unknown Entity: " << e->rtti() << "</b>"
++ << "</td></tr>";
++ break;
++ }
++
++ if (e->isContainer() || e->rtti()==RS2::EntityHatch) {
++ RS_EntityContainer* ec = (RS_EntityContainer*)e;
++ dumpFile << "<table><tr><td valign=\"top\">&nbsp;&nbsp;&nbsp;&nbsp;Contents:</td><td>\n";
++ dumpFile.close();
++ slotTestDumpEntities(ec);
++ dumpFile.open("debug_entities.html", std::ios::app);
++ dumpFile << "</td></tr></table>\n";
++ }
++
++ dumpFile
++ << "</td></tr>"
++ << "</table>\n"
++ << "<br><br>";
++ }
++
++ if (level==0) {
++ dumpFile << "</body>\n";
++ dumpFile << "</html>\n";
++ } else {
++ level--;
++ }
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestDumpUndo() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestDumpUndo()");
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ std::cout << *(RS_Undo*)d;
++ std::cout << std::endl;
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestUpdateInserts() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestUpdateInserts()");
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ d->updateInserts();
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestDrawFreehand() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestDrawFreehand()");
++
++
++ //RS_Graphic* g = document->getMarking();
++ /*
++
++ RS_ActionDrawLineFree* action =
++ new RS_ActionDrawLineFree(*document->getGraphic(),
++ *graphicView);
++
++ for (int i=0; i<100; ++i) {
++
++ int posx = (random()%600);
++ int posy = (random()%400);
++
++ //RS_MouseEvent rsm1(posx, posy, LEFT);
++ RS_MouseEvent rsm1(QEvent::MouseButtonPress,
++ QPoint(posx,posy),
++ RS2::LeftButton,
++ RS2::LeftButton);
++ action->mousePressEvent(&rsm1);
++
++ int speedx = 0;
++ int speedy = 0;
++
++ for (int k=0; k<100; ++k) {
++ int accx = (random()%40)-20;
++ int accy = (random()%40)-20;
++
++ speedx+=accx;
++ speedy+=accy;
++
++ posx+=speedx;
++ posy+=speedy;
++
++ //RS_MouseEvent rsm2(posx, posy, LEFT);
++
++ RS_MouseEvent rsm2(QEvent::MouseMove,
++ QPoint(posx,posy),
++ RS2::LeftButton,
++ RS2::LeftButton);
++ action->mouseMoveEvent(&rsm2);
++ }
++
++ action->mouseReleaseEvent(NULL);
++
++ slotFileSave();
++ }
++
++ delete action;
++ */
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestInsertBlock() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestInsertBlock()");
++
++ RS_Document* d = getDocument();
++ if (d!=NULL && d->rtti()==RS2::EntityGraphic) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ graphic->addLayer(new RS_Layer("default"));
++ RS_Block* block = new RS_Block(graphic, RS_BlockData("debugblock",
++ RS_Vector(0.0,0.0), true));
++
++ RS_Line* line;
++ RS_Arc* arc;
++ RS_Circle* circle;
++
++ // Add one red line:
++ line = new RS_Line(block,
++ RS_LineData(RS_Vector(0.0,0.0),
++ RS_Vector(50.0,0.0)));
++ line->setLayerToActive();
++ line->setPen(RS_Pen(RS_Color(255, 0, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ block->addEntity(line);
++
++ // Add one line with attributes from block:
++ line = new RS_Line(block,
++ RS_LineData(RS_Vector(50.0,0.0),
++ RS_Vector(50.0,50.0)));
++ line->setPen(RS_Pen(RS_Color(RS2::FlagByBlock),
++ RS2::WidthByBlock,
++ RS2::LineByBlock));
++ block->addEntity(line);
++
++ // Add one arc with attributes from block:
++ RS_ArcData d(RS_Vector(50.0,0.0),
++ 50.0, M_PI/2.0, M_PI,
++ false);
++ arc = new RS_Arc(block, d);
++ arc->setPen(RS_Pen(RS_Color(RS2::FlagByBlock),
++ RS2::WidthByBlock,
++ RS2::LineByBlock));
++ block->addEntity(arc);
++
++ // Add one blue circle:
++ RS_CircleData circleData(RS_Vector(20.0,15.0),
++ 12.5);
++ circle = new RS_Circle(block, circleData);
++ circle->setLayerToActive();
++ circle->setPen(RS_Pen(RS_Color(0, 0, 255),
++ RS2::Width01,
++ RS2::SolidLine));
++ block->addEntity(circle);
++
++
++ graphic->addBlock(block);
++
++
++
++ RS_Insert* ins;
++ RS_InsertData insData("debugblock",
++ RS_Vector(0.0,0.0),
++ RS_Vector(1.0,1.0), 0.0,
++ 1, 1, RS_Vector(0.0, 0.0),
++ NULL, RS2::NoUpdate);
++
++ // insert one magenta instance of the block (original):
++ ins = new RS_Insert(graphic, insData);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(255, 0, 255),
++ RS2::Width02,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++
++ // insert one green instance of the block (rotate):
++ insData = RS_InsertData("debugblock",
++ RS_Vector(-50.0,20.0),
++ RS_Vector(1.0,1.0), 30.0/ARAD,
++ 1, 1, RS_Vector(0.0, 0.0),
++ NULL, RS2::NoUpdate);
++ ins = new RS_Insert(graphic, insData);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(0, 255, 0),
++ RS2::Width02,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++
++ // insert one cyan instance of the block (move):
++ insData = RS_InsertData("debugblock",
++ RS_Vector(10.0,20.0),
++ RS_Vector(1.0,1.0), 0.0,
++ 1, 1, RS_Vector(0.0, 0.0),
++ NULL, RS2::NoUpdate);
++ ins = new RS_Insert(graphic, insData);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(0, 255, 255),
++ RS2::Width02,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++
++ // insert one blue instance of the block:
++ for (double a=0.0; a<360.0; a+=45.0) {
++ insData = RS_InsertData("debugblock",
++ RS_Vector(60.0,0.0),
++ RS_Vector(2.0/5,2.0/5), a/ARAD,
++ 1, 1, RS_Vector(0.0, 0.0),
++ NULL, RS2::NoUpdate);
++ ins = new RS_Insert(graphic, insData);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(0, 0, 255),
++ RS2::Width05,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++ }
++
++ // insert an array of yellow instances of the block:
++ insData = RS_InsertData("debugblock",
++ RS_Vector(-100.0,-100.0),
++ RS_Vector(0.2,0.2), M_PI/6.0,
++ 6, 4, RS_Vector(100.0, 100.0),
++ NULL, RS2::NoUpdate);
++ ins = new RS_Insert(graphic, insData);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(255, 255, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++
++
++ RS_GraphicView* v = getGraphicView();
++ if (v!=NULL) {
++ v->redraw();
++ }
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestInsertEllipse() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestInsertEllipse()");
++
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ RS_Ellipse* ellipse;
++ RS_Line* line;
++
++ for (double a=0.0; a<2*M_PI; a+=0.1) {
++ RS_Vector v;
++ v.setPolar(50.0, a);
++ double xp = 1000.0*a;
++
++ RS_EllipseData ellipseData(RS_Vector(xp,0.0),
++ v,
++ 0.5,
++ 0.0, 2*M_PI,
++ false);
++ ellipse = new RS_Ellipse(graphic, ellipseData);
++
++ ellipse->setPen(RS_Pen(RS_Color(255, 0, 255),
++ RS2::Width01,
++ RS2::SolidLine));
++
++ graphic->addEntity(ellipse);
++ //graphic->addEntity(new RS_Point(graphic, ellipse->getMax()));
++ //graphic->addEntity(new RS_Point(graphic, ellipse->getMin()));
++
++ line = new RS_Line(graphic,
++ RS_LineData(RS_Vector(xp,0.0),
++ RS_Vector(xp,0.0)+v));
++ line->setPen(RS_Pen(RS_Color(128, 128, 128),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(line);
++
++
++ /*
++ for (double mx=-60.0; mx<60.0; mx+=1.0) {
++ //for (double mx=0.0; mx<1.0; mx+=2.5) {
++ RS_VectorSolutions sol = ellipse->mapX(xp + mx);
++ //graphic->addEntity(new RS_Point(graphic,
++ // sol.vector2 + RS_Vector(a*500.0, 0.0)));
++ //graphic->addEntity(new RS_Point(graphic,
++ // sol.vector3 + RS_Vector(a*500.0, 0.0)));
++ //graphic->addEntity(new RS_Point(graphic,
++ // sol.vector4 + RS_Vector(a*500.0, 0.0)));
++
++ line = new RS_Line(graphic,
++ RS_LineData(RS_Vector(xp+mx,-50.0),
++ RS_Vector(xp+mx,50.0)));
++ line->setPen(RS_Pen(RS_Color(60, 60, 60),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(line);
++
++ graphic->addEntity(new RS_Point(graphic,
++ sol.get(0)));
++ }
++ */
++ }
++
++
++ // different minor/minor relations
++ /*
++ double x, y;
++ for (y=-250.0; y<=250.0; y+=50.0) {
++ for (x=-250.0; x<=250.0; x+=50.0) {
++ RS_Vector v(x, y);
++
++ ellipse = new RS_Ellipse(graphic,
++ v,
++ RS_Vector((x/5+50.0)/2.0, 0.0),
++ fabs(x/y),
++ 0.0, 2*M_PI,
++ false);
++
++ ellipse->setPen(RS_Pen(RS_Color(255, 255, 0),
++ RS2::Width01,
++ RS2::DashDotLine));
++
++ graphic->addEntity(ellipse);
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMax()));
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMin()));
++
++ ellipse = new RS_Ellipse(graphic,
++ v + RS_Vector(750.0, 0.0),
++ RS_Vector((x/5+50.0)/2.0, 0.0),
++ fabs(x/y),
++ 2*M_PI, 0.0,
++ true);
++
++ graphic->addEntity(ellipse);
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMax()));
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMin()));
++ }
++ }
++ */
++
++ /*
++ // different rotation angles:
++ double rot;
++ for (rot=0.0; rot<=2*M_PI+0.1; rot+=(M_PI/8)) {
++ ellipse = new RS_Ellipse(graphic,
++ RS_Vector(rot*200, 500.0),
++ RS_Vector(50.0, 0.0).rotate(rot),
++ 0.3,
++ 0.0, 2*M_PI,
++ false);
++ graphic->addEntity(ellipse);
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMax()));
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMin()));
++ }
++
++
++ // different arc angles:
++ double a1, a2;
++ for (rot=0.0; rot<=2*M_PI+0.1; rot+=(M_PI/8)) {
++ for (a1=0.0; a1<=2*M_PI+0.1; a1+=(M_PI/8)) {
++ for (a2=a1+M_PI/8; a2<=2*M_PI+a1+0.1; a2+=(M_PI/8)) {
++ ellipse = new RS_Ellipse(graphic,
++ RS_Vector(-500.0-a1*200.0-5000.0*rot,
++ 500.0-a2*200.0),
++ RS_Vector(50.0, 0.0).rotate(rot),
++ 0.3,
++ a1, a2,
++ false);
++ graphic->addEntity(ellipse);
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMax()));
++ graphic->addEntity(new RS_Point(graphic, ellipse->getMin()));
++ }
++ }
++ }
++ */
++
++ RS_GraphicView* v = getGraphicView();
++ if (v!=NULL) {
++ v->redraw();
++ }
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestInsertText() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestInsertText()");
++
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ RS_Text* text;
++ RS_TextData textData;
++
++ textData = RS_TextData(RS_Vector(10.0,10.0),
++ 10.0, 100.0,
++ RS2::VAlignTop,
++ RS2::HAlignLeft,
++ RS2::LeftToRight,
++ RS2::Exact,
++ 1.0,
++ "Andrew",
++ "normal",
++ 0.0);
++ text = new RS_Text(graphic, textData);
++
++ text->setLayerToActive();
++ text->setPen(RS_Pen(RS_Color(255, 0, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(text);
++
++ /*
++ double x, y;
++ for (y=-250.0; y<=250.0; y+=50.0) {
++ for (x=-250.0; x<=250.0; x+=50.0) {
++ RS_Vector v(x, y);
++
++ textData = RS_TextData(v,
++ 10.0, 100.0,
++ RS2::VAlignTop,
++ RS2::HAlignLeft,
++ RS2::LeftToRight,
++ RS2::Exact,
++ 1.0,
++ "Andrew",
++ "normal",
++ 0.0);
++
++ text = new RS_Text(graphic, textData);
++
++ text->setLayerToActive();
++ text->setPen(RS_Pen(RS_Color(255, 0, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(text);
++ }
++ }
++
++ RS_Line* line;
++ for (x=0.0; x<M_PI*2.0; x+=0.2) {
++ RS_Vector v(600.0+cos(x)*50.0, 0.0+sin(x)*50.0);
++
++ line = new RS_Line(graphic,
++ RS_LineData(RS_Vector(600.0,0.0),
++ v));
++ line->setLayerToActive();
++ line->setPenToActive();
++ graphic->addEntity(line);
++
++ textData = RS_TextData(v,
++ 5.0, 50.0,
++ RS2::VAlignTop,
++ RS2::HAlignLeft,
++ RS2::LeftToRight,
++ RS2::Exact,
++ 1.0,
++ "Andrew",
++ "normal",
++ x);
++
++ text = new RS_Text(graphic, textData);
++
++ text->setLayerToActive();
++ text->setPen(RS_Pen(RS_Color(255, 0, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(text);
++ }
++
++ RS_SolidData solidData = RS_SolidData(RS_Vector(5.0, 10.0),
++ RS_Vector(25.0, 15.0),
++ RS_Vector(15.0, 30.0));
++
++ RS_Solid* s = new RS_Solid(graphic, solidData);
++
++ s->setLayerToActive();
++ s->setPen(RS_Pen(RS_Color(255, 255, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(s);
++
++ RS_GraphicView* v = getGraphicView();
++ if (v!=NULL) {
++ v->redraw();
++ }
++ */
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestInsertImage() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestInsertImage()");
++
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ RS_Image* image;
++ RS_ImageData imageData;
++
++ imageData = RS_ImageData(0, RS_Vector(50.0,30.0),
++ RS_Vector(0.5,0.5),
++ RS_Vector(-0.5,0.5),
++ RS_Vector(640,480),
++ "/home/andrew/data/image.png",
++ 50, 50, 0);
++ image = new RS_Image(graphic, imageData);
++
++ image->setLayerToActive();
++ image->setPen(RS_Pen(RS_Color(255, 0, 0),
++ RS2::Width01,
++ RS2::SolidLine));
++ graphic->addEntity(image);
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestUnicode() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestUnicode()");
++
++ slotFileOpen("./fonts/unicode.cxf", RS2::FormatCXF);
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ RS_Insert* ins;
++
++ int col;
++ int row;
++ RS_Char uCode; // e.g. 65 (or 'A')
++ RS_String strCode; // unicde as string e.g. '[0041] A'
++
++ graphic->setAutoUpdateBorders(false);
++
++ for (col=0x0000; col<=0xFFF0; col+=0x10) {
++ printf("col: %X\n", col);
++ for (row=0x0; row<=0xF; row++) {
++ //printf(" row: %X\n", row);
++
++ uCode = RS_Char(col+row);
++ //printf(" code: %X\n", uCode.unicode());
++
++ strCode.setNum(uCode.unicode(), 16);
++ while (strCode.length()<4) {
++ strCode="0"+strCode;
++ }
++ strCode = "[" + strCode + "] " + uCode;
++
++ if (graphic->findBlock(strCode)!=NULL) {
++ RS_InsertData d(strCode,
++ RS_Vector(col/0x10*20.0,row*20.0),
++ RS_Vector(1.0,1.0), 0.0,
++ 1, 1, RS_Vector(0.0, 0.0),
++ NULL, RS2::NoUpdate);
++ ins = new RS_Insert(graphic, d);
++ ins->setLayerToActive();
++ ins->setPen(RS_Pen(RS_Color(255, 255, 255),
++ RS2::Width01,
++ RS2::SolidLine));
++ ins->update();
++ graphic->addEntity(ins);
++ }
++ }
++ }
++ graphic->setAutoUpdateBorders(true);
++ graphic->calculateBorders();
++ }
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestMath01() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestMath01()");
++
++ RS_Document* d = getDocument();
++ if (d!=NULL) {
++ RS_Graphic* graphic = (RS_Graphic*)d;
++ if (graphic==NULL) {
++ return;
++ }
++
++ // axis
++ graphic->addEntity(new RS_Line(graphic,
++ RS_LineData(RS_Vector(0.0,0.0),
++ RS_Vector(2*M_PI,0.0))));
++ graphic->addEntity(new RS_Line(graphic,
++ RS_LineData(RS_Vector(0.0,-1.0),
++ RS_Vector(0.0,1.0))));
++
++ // cos
++ double a;
++ double x = 59.0/ARAD;
++ double x_0 = 60.0/ARAD;
++ for (a=0.01; a<2*M_PI; a+=0.01) {
++ // cos curve:
++ RS_Line* line = new RS_Line(graphic,
++ RS_LineData(RS_Vector(a-0.01, cos(a-0.01)),
++ RS_Vector(a, cos(a))));
++ graphic->addEntity(line);
++
++ // tangent:
++ graphic->addEntity(new RS_Line(graphic,
++ RS_LineData(RS_Vector(a-0.01,cos(x_0)-sin(x_0)*(a-0.01-x_0)),
++ RS_Vector(a,cos(x_0)-sin(x_0)*(a-x_0)))));
++ }
++
++ // 59.0 deg
++ graphic->addEntity(new RS_Line(graphic,
++ RS_LineData(RS_Vector(x,0.0),
++ RS_Vector(x,1.0))));
++
++ // 60.0 deg
++ graphic->addEntity(new RS_Line(graphic,
++ RS_LineData(RS_Vector(x_0,0.0),
++ RS_Vector(x_0,1.0))));
++
++ // tangent
++ //graphic->addEntity(new RS_Line(graphic,
++ // RS_Vector(0.0,cos(x_0)-sin(x_0)*(0.0-x_0)),
++ // RS_Vector(6.0,cos(x_0)-sin(x_0)*(6.0-x_0))));
++
++
++ RS_GraphicView* v = getGraphicView();
++ if (v!=NULL) {
++ v->redraw();
++ }
++ }
++}
++
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestResize640() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestResize640()");
++
++ resize(640, 480);
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestResize800() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestResize800()");
++
++ resize(800, 600);
++}
++
++
++
++/**
++ * Testing function.
++ */
++void QC_ApplicationWindow::slotTestResize1024() {
++ RS_DEBUG->print("QC_ApplicationWindow::slotTestResize1024()");
++
++ resize(1024, 768);
++}
++
++
++
++/**
++ * overloaded for Message box on last window exit.
++ */
++bool QC_ApplicationWindow::queryExit(bool force) {
++ RS_DEBUG->print("QC_ApplicationWindow::queryExit()");
++
++ bool succ = true;
++
++ // demo:
++ if (force) {
++ QMessageBox::information(this, QMessageBox::tr("Warning"),
++ tr("This is a %1 version "
++ "which terminates\n"
++ "automatically after 10min. This software is\n"
++ "not intended for production use. Please buy\n"
++ "a full version of the application from\n%2.\n"
++ "You can save your work now.")
++ .arg(QC_APPNAME)
++#ifdef QC_CUSTOM_VENDOR
++ .arg(QC_CUSTOM_VENDOR),
++#else
++ .arg("RibbonSoft, http://www.ribbonsoft.com"),
++#endif
++ QMessageBox::Ok);
++ }
++
++ QWidgetList list = workspace->windowList();
++ for (QWidget* w = list.first(); w!=NULL; w = list.next()) {
++ succ = ((QC_MDIWindow*)w)->closeMDI(force);
++ if (!succ) {
++ break;
++ }
++ }
++ if (succ) {
++ storeSettings();
++ }
++
++ RS_DEBUG->print("QC_ApplicationWindow::queryExit(): OK");
++
++ return succ;
++}
++
++
++
++/**
++ * Handle hotkeys. Don't let it to the default handler of Qt.
++ * it will consume them also if a text field is active
++ * which means it's impossible to enter a command.
++ */
++void QC_ApplicationWindow::keyPressEvent(QKeyEvent* e) {
++
++ // timer
++ static QTime ts = QTime();
++ static QString firstKey = "";
++
++ // single key codes:
++ switch (e->key()) {
++ case Qt::Key_Shift:
++ case Qt::Key_Control:
++ case Qt::Key_Meta:
++ case Qt::Key_Alt:
++ case Qt::Key_CapsLock: {
++ QMainWindow::keyPressEvent(e);
++
++ // forward to actions:
++ RS_GraphicView* graphicView = getGraphicView();
++ if (graphicView!=NULL) {
++ graphicView->keyPressEvent(e);
++ }
++ e->accept();
++ }
++ break;
++
++ case Qt::Key_Escape:
++ firstKey = "";
++ slotBack();
++ e->accept();
++ break;
++
++ case Qt::Key_Return:
++ if (firstKey.isEmpty()) {
++ slotEnter();
++ e->accept();
++ }
++ break;
++
++ case Qt::Key_Plus:
++ if (firstKey.isEmpty()) {
++ actionHandler->slotZoomIn();
++ e->accept();
++ }
++ break;
++
++ case Qt::Key_Minus:
++ if (firstKey.isEmpty()) {
++ actionHandler->slotZoomOut();
++ e->accept();
++ }
++ break;
++
++ default:
++ e->ignore();
++ break;
++ }
++
++ if (e->isAccepted()) {
++ return;
++ }
++
++ QTime now = QTime::currentTime();
++
++ // multi key codes:
++ if (ts.msecsTo(now)<2000) {
++ QString code =
++ QString("%1%2").arg(firstKey).arg(QChar(e->key())).lower();
++
++ if (actionHandler->keycode(code)==false) {
++ ts = now;
++ if (QChar(e->key()).isPrint()) {
++ firstKey += e->key();
++ }
++ }
++ else {
++ firstKey="";
++ }
++ }
++ else {
++ ts = now;
++ if (QChar(e->key()).isPrint()) {
++ firstKey = e->key();
++ }
++ }
++
++ QMainWindow::keyPressEvent(e);
++}
++
++
++void QC_ApplicationWindow::keyReleaseEvent(QKeyEvent* e) {
++
++ switch (e->key()) {
++ case Qt::Key_Shift:
++ case Qt::Key_Control:
++ case Qt::Key_Meta:
++ case Qt::Key_Alt:
++ case Qt::Key_CapsLock: {
++ QMainWindow::keyReleaseEvent(e);
++
++ // forward to actions:
++ RS_GraphicView* graphicView = getGraphicView();
++ if (graphicView!=NULL) {
++ graphicView->keyReleaseEvent(e);
++ }
++ e->accept();
++ }
++ break;
++ }
++
++ QMainWindow::keyPressEvent(e);
++}
++
++
diff --git a/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-pedantic.patch b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-pedantic.patch
new file mode 100644
index 0000000..89472ce
--- /dev/null
+++ b/sci-misc/qcad/files/qcad-2.0.5.0-1-community.src-pedantic.patch
@@ -0,0 +1,10 @@
+--- mkspecs/defs.pro.old 2007-07-20 00:31:08.000000000 +0200
++++ mkspecs/defs.pro 2007-07-20 00:31:20.000000000 +0200
+@@ -1,7 +1,4 @@
+ # $Id: defs.pro 606 2004-12-25 03:08:40Z andrew $
+-QMAKE_CXXFLAGS_DEBUG += -pedantic
+-QMAKE_CXXFLAGS += -pedantic
+-
+ win32 {
+ QMAKE_CFLAGS_THREAD -= -mthreads
+ QMAKE_LFLAGS_THREAD -= -mthreads
diff --git a/sci-misc/qcad/qcad-2.0.5.0.ebuild b/sci-misc/qcad/qcad-2.0.5.0.ebuild
new file mode 100644
index 0000000..dc1c3e0
--- /dev/null
+++ b/sci-misc/qcad/qcad-2.0.5.0.ebuild
@@ -0,0 +1,97 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+inherit kde-functions eutils flag-o-matic
+
+MY_PV=${PV}-1
+MY_P=${P}-1-community.src
+S=${WORKDIR}/${MY_P}
+DESCRIPTION="A 2D CAD package based upon Qt."
+SRC_URI="http://www.ribbonsoft.com/archives/qcad/${MY_P}.tar.gz
+ doc? ( mirror://gentoo/qcad-manual-200404.tar.bz2
+ http://dev.gentoo.org/~phosphan/qcad-manual-200404.tar.bz2 )"
+HOMEPAGE="http://www.ribbonsoft.com/qcad.html"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="doc"
+KEYWORDS="~amd64 ~hppa ~ppc ~ppc64 ~x86"
+
+DEPEND=">=sys-apps/sed-4"
+need-qt 3.3.4
+
+src_unpack() {
+ unpack ${A}
+ # Bug 112864 - fix dir unpack bug
+ touch ${WORKDIR}
+ cd ${S}
+ echo >> defs.pro "DEFINES += _REENTRANT QT_THREAD_SUPPORT"
+ echo >> defs.pro "CONFIG += thread release"
+ echo >> defs.pro "QMAKE_CFLAGS_RELEASE += ${CFLAGS}"
+ echo >> defs.pro "QMAKE_CXXFLAGS_RELEASE += ${CXXFLAGS}"
+ for file in */Makefile scripts/build_qcad.sh; do
+ sed -i -e 's~qmake~${QTDIR}/bin/qmake~g' $file || \
+ die "unable to correct path to qmake in $file"
+ done
+ epatch ${FILESDIR}/${MY_P}-gentoo.patch
+ epatch ${FILESDIR}/${MY_P}-manual.patch
+ epatch ${FILESDIR}/${MY_P}-intptr.patch
+
+ epatch ${FILESDIR}/${MY_P}-pedantic.patch
+
+ cd ${S}/scripts
+ sed -i -e 's/^make/make ${MAKEOPTS}/' build_qcad.sh || \
+ die "unable to add MAKEOPTS"
+ sed -i -e 's/^\.\/configure/.\/configure --host=${CHOST}/' build_qcad.sh \
+ || die "unable to set CHOST"
+ cd ${S}/qcad/src
+ sed -i -e "s:FULLASSISTANTPATH:${QTDIR}/bin:" qc_applicationwindow.cpp \
+ || die "sed failed on assistant path"
+ sed -i -e "s:QCADDOCPATH:/usr/share/doc/${PF}:" \
+ qc_applicationwindow.cpp || die "sed failed on manual path"
+
+}
+
+src_compile() {
+ # we need to filter -pedantic flag to avoid bail-out
+ filter-flags -pedantic
+ ### borrowed from kde.eclass #
+ #
+ # fix the sandbox errors "can't write to .kde or .qt" problems.
+ # this is a fake homedir that is writeable under the sandbox, so that the build process
+ # can do anything it wants with it.
+ REALHOME="$HOME"
+ mkdir -p $T/fakehome/.kde
+ mkdir -p $T/fakehome/.qt
+ export HOME="$T/fakehome"
+ # things that should access the real homedir
+ [ -d "$REALHOME/.ccache" ] && ln -sf "$REALHOME/.ccache" "$HOME/"
+ cd scripts
+ # We need to call with notrans since release_translations.sh does not exist
+ sh build_qcad.sh notrans || die "build failed"
+ if ! test -f ${S}/qcad/qcad; then
+ die "no binary created, build failed"
+ fi
+}
+
+src_install () {
+ cd qcad
+ mv qcad qcad.bin
+ dobin qcad.bin
+ echo -e "#!/bin/sh\ncd /usr/share/${P}\nqcad.bin" > qcad
+ chmod ugo+rx qcad
+ dobin qcad
+ dodir /usr/share/${P}
+ cp -pPR patterns examples fonts qm ${D}/usr/share/${P}
+ insinto /usr/share/pixmaps
+ doins src/xpm/qcad.xpm
+ dodoc README
+ cd ..
+ if use doc; then
+ insinto /usr/share/doc/${PF}/
+ cd ${WORKDIR}
+ cp -pPR qcaddoc.adp cad ${D}usr/share/doc/${PF}
+ fi
+ make_desktop_entry ${PN} QCad ${PN}.xpm Office
+}