]> Shamusworld >> Repos - architektonas/blobdiff - src/mainapp/mdiwindow.cpp
Fixed problem with MDI activation.
[architektonas] / src / mainapp / mdiwindow.cpp
index d20e4e7055659bc165e3aae64771ce3970725291..a592c4bd6bc1f1d9ab335646b3e57c841174f2c2 100644 (file)
@@ -30,17 +30,27 @@ int MDIWindow::idCounter = 0;
  *
  * @param doc Pointer to an existing document of NULL if a new
  *   document shall be created for this window.
- * @param parent Parent widget. Usually a workspace.
+ * @param parent Parent widget. Usually a workspace (QMdiArea).
  */
 MDIWindow::MDIWindow(Document * doc, QWidget * parent, const char * name/*= NULL*/,
-       Qt::WindowFlags wflags/*= Qt::WDestructiveClose*/):
-       QMdiSubWindow(parent, Qt::SubWindow), owner(false), forceClosing(false)
+       Qt::WindowFlags wflags/*= Qt::SubWindow*/):
+       QMdiSubWindow(parent, Qt::SubWindow), 
+owner(false)
 #warning "!!! wflags is ignored !!!"
 {
+// This warning not longer occurs...!
 //This warning is most likely coming from the QMdiSubWindow() constructor above...
-#warning "QWidget::setMinimumSize: (/QMdi::ControlLabel) Negative sizes (-1,-1) are not possible"
+//#warning "QWidget::setMinimumSize: (/QMdi::ControlLabel) Negative sizes (-1,-1) are not possible"
        initDoc(doc);
-       initView();
+
+       graphicView = new QG_GraphicView(document, this);
+//Let's see if the trouble is in the graphicView...
+//And it is... So... How to fix this???
+       setWidget(graphicView);
+//THIS was the problem... Somehow, setting focus on the this widget was screwing
+//*everything* about the MDI system up!
+//     graphicView->setFocus();
+
        id = idCounter++;
        parentWindow = NULL;
 
@@ -90,12 +100,10 @@ MDIWindow::~MDIWindow()
  */
 void MDIWindow::addChildWindow(MDIWindow * w)
 {
-    DEBUG->print("RS_MDIWindow::addChildWindow()");
-
-    childWindows.append(w);
-    w->setParentWindow(this);
-
-    DEBUG->print("children: %d", childWindows.count());
+       DEBUG->print("RS_MDIWindow::addChildWindow()");
+       childWindows.append(w);
+       w->setParentWindow(this);
+       DEBUG->print("children: %d", childWindows.count());
 }
 
 /**
@@ -105,13 +113,10 @@ void MDIWindow::addChildWindow(MDIWindow * w)
  */
 void MDIWindow::removeChildWindow(MDIWindow * w)
 {
-    DEBUG->print("RS_MDIWindow::removeChildWindow()");
-
-//    bool suc = childWindows.remove(w);
-    bool suc = childWindows.removeOne(w);
-    DEBUG->print("successfully removed child window: %d", (int)suc);
-
-    DEBUG->print("children: %d", childWindows.count());
+       DEBUG->print("RS_MDIWindow::removeChildWindow()");
+       bool success = childWindows.removeOne(w);
+       DEBUG->print("successfully removed child window: %s.", (success ? "yes" : "NO"));
+       DEBUG->print("# of children: %d", childWindows.count());
 }
 
 /**
@@ -119,11 +124,11 @@ void MDIWindow::removeChildWindow(MDIWindow * w)
  */
 MDIWindow * MDIWindow::getPrintPreview()
 {
-    for(uint i=0; i<childWindows.count(); ++i)
+       for(int i=0; i<childWindows.count(); i++)
        {
-        if (childWindows.at(i)->getGraphicView()->isPrintPreview())
+               if (childWindows.at(i)->getGraphicView()->isPrintPreview())
                        return childWindows.at(i);
-    }
+       }
 
        return NULL;
 }
@@ -134,13 +139,13 @@ MDIWindow * MDIWindow::getPrintPreview()
  * @param force Disable cancel button (demo versions)
  * @param ask Ask user before closing.
  */
-bool MDIWindow::closeMDI(bool force, bool ask)
+bool MDIWindow::CloseMDI(void)
 {
-       // should never happen:
+       // This should never happen:
        if (!document)
                return true;
 
-       bool ret = false;
+       bool closed = false;
        bool isBlock = (parentWindow != NULL);
 
        // This is a block and we don't need to ask the user for closing
@@ -148,6 +153,7 @@ bool MDIWindow::closeMDI(bool force, bool ask)
        if (isBlock)
        {
                DEBUG->print("  closing block");
+
                // tell parent window we're not here anymore.
                if (parentWindow)
                {
@@ -156,15 +162,14 @@ bool MDIWindow::closeMDI(bool force, bool ask)
                }
 
                emit(signalClosing());
-               ret = true;
+               closed = true;
        }
-       // This is a graphic document. ask user for closing.
-       else if (!ask || slotFileClose(force))
+       // This is a drawing document. Ask user for closing.
+       else if (slotFileClose())
        {
                DEBUG->print("  closing graphic");
-               // close all child windows:
-               bool done;
 
+               // Close all child windows:
                while (!childWindows.isEmpty())
                {
                        MDIWindow * child = childWindows.takeFirst();
@@ -174,15 +179,10 @@ bool MDIWindow::closeMDI(bool force, bool ask)
                }
 
                emit(signalClosing());
-               ret = true;
-       }
-       // User decided not to close graphic document:
-       else
-       {
-               ret = false;
+               closed = true;
        }
 
-       return (ret || force);
+       return closed;
 }
 
 /**
@@ -190,22 +190,15 @@ bool MDIWindow::closeMDI(bool force, bool ask)
  */
 void MDIWindow::closeEvent(QCloseEvent * ce)
 {
-    DEBUG->print("MDIWindow::closeEvent begin");
+       DEBUG->print("MDIWindow::closeEvent begin");
 
-    if (closeMDI(false, !forceClosing))
-        ce->accept();
-    else
-        ce->ignore();
+       (CloseMDI() ? ce->accept() : ce->ignore());
 
-    DEBUG->print("MDIWindow::closeEvent end");
+       DEBUG->print("MDIWindow::closeEvent end");
 }
 
 /**
- * Init the document.
- *
- * @param type Document type. RS:EntityGraphic or RS2::EntityBlock
- * @param container Entity container to be used as document or NULL
- * if a new document should be created.
+ * Initialize the document.
  */
 void MDIWindow::initDoc(Document * doc)
 {
@@ -213,7 +206,7 @@ void MDIWindow::initDoc(Document * doc)
 
        if (!doc)
        {
-               document = new Drawing();
+               document = new Drawing();                               // Drawing is derived from Document
                document->newDoc();
                owner = true;
        }
@@ -224,19 +217,6 @@ void MDIWindow::initDoc(Document * doc)
        }
 }
 
-/**
- * Init the view.
- */
-void MDIWindow::initView()
-{
-       DEBUG->print("MDIWindow::initView()");
-
-//     graphicView = new QC_GraphicView(document, this);
-       graphicView = new QG_GraphicView(document, this);
-       setWidget(graphicView);
-       graphicView->setFocus();
-}
-
 /**
  * Called when the current pen (color, style, width) has changed.
  * Sets the active pen for the document in this MDI window.
@@ -368,71 +348,63 @@ bool MDIWindow::slotFileSaveAs(bool & cancelled)
 
 /**
  * Requests the closing of this MDI window.
- *
- * @param force Force closing by disabling the cancel button (for demo versions).
  */
-bool MDIWindow::slotFileClose(bool force)
+bool MDIWindow::slotFileClose(void)
 {
        DEBUG->print("MDIWindow::slotFileClose()");
+       bool succeeded = true;
+
+       if (document == NULL || !document->isModified())
+               return succeeded;
 
-       bool succ = true;
-       int exit = 0;
+       ExitDialog dlg(this);
 
-       if (document && document->isModified())
+       if (document->getFilename().isEmpty())
+               dlg.setText(tr("Do you really want to discard this drawing?"));
+       else
        {
-               ExitDialog dlg(this);
-               dlg.setForce(force);
+               QString fn = document->getFilename();
 
-               if (document->getFilename().isEmpty())
-                       dlg.setText(tr("Do you really want to close the drawing?"));
-               else
-               {
-                       QString fn = document->getFilename();
+               if (fn.length() > 50)
+                       fn = QString("%1...%2").arg(fn.left(24)).arg(fn.right(24));
 
-                       if (fn.length() > 50)
-                               fn = QString("%1...%2").arg(fn.left(24)).arg(fn.right(24));
+               dlg.setText(tr("Do you really want to discard changes to the file\n%1?").arg(fn));
+       }
 
-                       dlg.setText(tr("Do you really want to close the file\n%1?").arg(fn));
-               }
+       dlg.setTitle(tr("Close Drawing"));
 
-               dlg.setTitle(tr("Closing Drawing"));
+       bool again = false;
 
-               bool again;
+       do
+       {
                bool cancelled;
+               int exit = dlg.exec();
 
-               do
+               switch (exit)
                {
+               case 0:                                                                 // Cancel
+                       succeeded = false;
+                       again = false;
+                       break;
+               case 1:                                                                 // OK (Leave)
+                       succeeded = true;
                        again = false;
-                       exit = dlg.exec();
-
-                       switch (exit)
-                       {
-                       case 0: // cancel
-                               succ = false;
-                               break;
-                       case 1: // leave
-                               succ = true;
-                               break;
-                       case 2: // save
-                               succ = slotFileSave(cancelled);
-                               again = !succ || cancelled;
-                               break;
-                       case 3: // save as
-                               succ = slotFileSaveAs(cancelled);
-                               again = !succ || cancelled;
-                               break;
-                       default:
-                               break;
-                       }
+                       break;
+               case 2:                                                                 // Save
+                       succeeded = slotFileSave(cancelled);
+                       again = !succeeded || cancelled;
+                       break;
+               case 3:                                                                 // Save As
+                       succeeded = slotFileSaveAs(cancelled);
+                       again = !succeeded || cancelled;
+                       break;
+               default:
+                       break;
                }
-               while (again);
-       }
-       else
-       {
-               succ = true;
        }
+       while (again);
 
-       return succ;
+       return succeeded;
 }
 
 void MDIWindow::slotFilePrint()
@@ -459,32 +431,37 @@ void MDIWindow::slotFilePrint()
        //statusBar()->message(tr("Ready."));
 }
 
-/** @return Pointer to graphic view */
+/**
+ * @return Pointer to graphic view
+ */
 //QC_GraphicView * MDIWindow::getGraphicView()
 QG_GraphicView * MDIWindow::getGraphicView()
 {
        return graphicView;
 }
 
-/** @return Pointer to document */
+/**
+ * @return Pointer to document
+ */
 Document * MDIWindow::getDocument()
 {
        return document;
 }
 
-/** @return Pointer to graphic or NULL */
-Drawing * MDIWindow::getGraphic()
+/**
+ * @return Pointer to Drawing or NULL
+ */
+Drawing * MDIWindow::GetDrawing()
 {
-       return document->getGraphic();
+       return document->GetDrawing();
 }
 
-/** @return Pointer to current event handler */
+/**
+ * @return Pointer to current event handler
+ */
 EventHandler * MDIWindow::getEventHandler()
 {
-       if (graphicView)
-               return graphicView->getEventHandler();
-       else
-               return NULL;
+       return (graphicView ? graphicView->getEventHandler() : NULL);
 }
 
 /**
@@ -504,11 +481,6 @@ int MDIWindow::getId()
        return id;
 }
 
-void MDIWindow::setForceClosing(bool on)
-{
-       forceClosing = on;
-}
-
 /**
  * Streams some info about an MDI window to stdout.
  */
@@ -521,7 +493,7 @@ std::ostream & operator<<(std::ostream & os, MDIWindow & w)
        else
                os << "  parentWindow: NULL\n";
 
-       for(uint i=0; i<w.childWindows.count(); ++i)
+       for(int i=0; i<w.childWindows.count(); i++)
                os << "  childWindow[" << i << "]: " << w.childWindows.at(i)->getId() << "\n";
 
        return os;