Completed the template editing functionality
[biaweb_qt.git] / article_dialog.py
index 3494138..6b51e70 100644 (file)
@@ -1,31 +1,65 @@
 # BiaWeb Website content manager (c) 2010 V.Harishankar
-# Category dialog class
+# Article dialog class
 
 import PyQt4
 import ui_article_dialog
+import highlighter
 
 class ArticleDialog (PyQt4.QtGui.QDialog, ui_article_dialog.Ui_ArticleDialog):
        def __init__ (self, parent):
                PyQt4.QtGui.QDialog.__init__ (self, parent)
                self.setupUi (self)
+               # set window to be able to be maximized or minimized
+               self.setWindowFlags (PyQt4.QtCore.Qt.Window)
+               # set the code highlighter to the document
+               self.hltext = highlighter.SimpleHtmlHighlighter (self.content.document ())
+
+       # when rejected, confirm first
+       def reject (self):
+               ans = PyQt4.QtGui.QMessageBox.question (self, "Confirm",
+                                       "Are you sure you wish to cancel all changes?",
+                                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+               if ans == PyQt4.QtGui.QMessageBox.Yes:
+                       PyQt4.QtGui.QDialog.reject (self)
+
+       # when accepted check the data
+       def accept (self):
+               title = str (self.article_title.text ()).strip ()
+               content = str (self.content.toPlainText ()).strip ()
+               stub = str (self.stub.text ()).strip ()
+
+               if title <> "" and content <> "" and stub <> "":
+                       PyQt4.QtGui.QDialog.accept (self)
+               else:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Missing fields", "Some required fields are missing")
+
+       # populate categories in combo box
+       def populate_categories (self, category_list, selected_cat = None):
+               for catid, catname, catdesc, stub in category_list:
+                       self.category.addItem (catname, int (catid))
+
+               # set the index to the selected category item
+               if selected_cat is not None:
+                       self.category.setCurrentIndex (self.category.findData (selected_cat))
 
        # when bold is clicked
        def onBold (self):
                textcur = self.content.textCursor ()
                sel = textcur.selectedText ()
-               boldsel = "<b>" + str (sel) + "</b>"
+               boldsel = "<b>" + sel + "</b>"
                textcur.insertText (boldsel)
 
        # when block quote is clicked
        def onBQuote (self):
                textcur = self.content.textCursor ()
                sel = textcur.selectedText ()
-               quotesel = "<blockquote>\n" + str (sel) + "\n</blockquote>"
+               quotesel = "<blockquote>\n" + sel + "\n</blockquote>"
                textcur.insertText (quotesel)
 
        # when bullet is clicked
        def onBullet (self):
-               pass
+               # insert bulleted list
+               self.insert_list_items ()
 
        # when code is clicked
        def onCode (self):
@@ -36,52 +70,166 @@ class ArticleDialog (PyQt4.QtGui.QDialog, ui_article_dialog.Ui_ArticleDialog):
 
        # when horiz rule is clicked
        def onHRule (self):
-               pass
+               textcur = self.content.textCursor ()
+               hrule = "\n<hr />\n"
+               textcur.clearSelection ()
+               textcur.insertText (hrule)
 
        # when image is clicked
        def onImage (self):
-               pass
+               img_url, ok = PyQt4.QtGui.QInputDialog.getText (self, "Image URL", "URL of the image to insert")
+               if not ok or img_url.isEmpty ():
+                       return
+               alt_txt, ok = PyQt4.QtGui.QInputDialog.getText (self, "Alt text", "Alternate text of the image")
+               if not ok or alt_txt.isEmpty ():
+                       return
+
+               textcur = self.content.textCursor ()
+               imgtag = '<img src="' + img_url + '" alt="' + alt_txt + '" />'
+               textcur.clearSelection ()
+               textcur.insertText (imgtag)
 
        # when italic is clicked
        def onItalic (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               italsel = "<i>" + sel + "</i>"
+               textcur.insertText (italsel)
 
        # when link is clicked
        def onLink (self):
-               pass
+               linkhref, ok = PyQt4.QtGui.QInputDialog.getText (self, "Link URL", "URL of the link to insert")
+               if not ok or linkhref.isEmpty ():
+                       return
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               linksel = '<a href="' + linkhref + '">' + sel + "</a>"
+               textcur.insertText (linksel)
 
        # when numbered is clicked
        def onNumber (self):
-               pass
+               # numbered list
+               self.insert_list_items (True)
+
+       # get a list of items in numbered or bulleted list
+       def insert_list_items (self, numbered = False):
+               if numbered:
+                       title = "Numbered list"
+                       otag = "\n<ol>\n"
+                       ctag = "</ol>\n"
+               else:
+                       title = "Bulleted list"
+                       otag = "\n<ul>\n"
+                       ctag = "</ul>\n"
+
+               itemlist = [ otag ]
+               while True:
+                       num_item, ok = PyQt4.QtGui.QInputDialog.getText (self, title,
+                                                       "List item content (leave blank to finish the list)")
+                       # if cancelled quit
+                       if not ok:
+                               return
+                       # if item is empty then close the list
+                       if num_item.isEmpty ():
+                               break
+                       itemlist.append ("   <li>" + num_item + "</li>\n")
+               itemlist.append (ctag)
+
+               textcur = self.content.textCursor ()
+               textcur.clearSelection ()
+               for item in itemlist:
+                       textcur.insertText (item)
+
 
        # when center is clicked
        def onCenter (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               paracentersel = '<p style="text-align:center;">' + sel + "</p>"
+               textcur.insertText (paracentersel)
 
        # when justify is clicked
        def onJustify (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               parajustsel = '<p style="text-align:justify;">' + sel + "</p>"
+               textcur.insertText (parajustsel)
 
        # when left is clicked
        def onLeft (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               paraleftsel = '<p style="text-align:left;">' + sel + "</p>"
+               textcur.insertText (paraleftsel)
 
        # when right is clicked
        def onRight (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               pararightsel = '<p style="text-align:right;">' + sel + "</p>"
+               textcur.insertText (pararightsel)
 
        # when pre is clicked
        def onPre (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               presel = "<pre>" + sel + "</pre>"
+               textcur.insertText (presel)
 
        # when para is clicked
        def onPara (self):
-               pass
+               textcur = self.content.textCursor ()
+               sel = textcur.selectedText ()
+               parasel = "<p>" + sel + "</p>"
+               textcur.insertText (parasel)
 
        # when table is clicked
        def onTable (self):
-               pass
+               # get the number of rows
+               rows, ok = PyQt4.QtGui.QInputDialog.getInt (self, "Table", "Number of table rows")
+               if not ok:
+                       return
+               # get the number of columns
+               cols, ok = PyQt4.QtGui.QInputDialog.getInt (self, "Table", "Number of table columns")
+               if not ok:
+                       return
+               # should there be a header row?
+               headerflag = PyQt4.QtGui.QMessageBox.question (self, "Header", "Do you want additional header row?",
+                                                                                                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No,
+                                                                                                       PyQt4.QtGui.QMessageBox.Cancel)
+               if headerflag == PyQt4.QtGui.QMessageBox.Cancel:
+                       return
+
+               # build the table tag
+               tablelist = ["\n<table>\n"]
+               if headerflag == PyQt4.QtGui.QMessageBox.Yes:
+                       tablelist.append (" <thead>\n")
+                       tablelist.append ("  <tr>\n")
+                       for i in range (cols):
+                               tablelist.append ("   <th></th>\n")
+                       tablelist.append ("  </tr>\n")
+                       tablelist.append (" </thead>\n")
+
+               tablelist.append (" <tbody>\n")
+               for j in range (rows):
+                       tablelist.append ("  <tr>\n")
+                       for i in range (cols):
+                               tablelist.append ("   <td></td>\n")
+                       tablelist.append ("  </tr>\n")
+               tablelist.append (" </tbody>\n")
+               tablelist.append ("</table>\n")
+
+               # insert the table
+               textcur = self.content.textCursor ()
+               textcur.clearSelection ()
+               for item in tablelist:
+                       textcur.insertText (item)
+
+
 
        # when break is clicked
        def onBreak (self):
-               pass
+               textcur = self.content.textCursor ()
+               breaktxt = "<br />\n"
+               textcur.clearSelection ()
+               textcur.insertText (breaktxt)