diff options
Diffstat (limited to 'src/dialogs/setupdisplay.cpp')
-rw-r--r-- | src/dialogs/setupdisplay.cpp | 602 |
1 files changed, 602 insertions, 0 deletions
diff --git a/src/dialogs/setupdisplay.cpp b/src/dialogs/setupdisplay.cpp new file mode 100644 index 0000000..6efa42f --- /dev/null +++ b/src/dialogs/setupdisplay.cpp @@ -0,0 +1,602 @@ +/*************************************************************************** +* Copyright (C) 2003-2005 * +* Jason Kivlighn ([email protected]) * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +***************************************************************************/ + +#include "setupdisplay.h" + +#include <tdeapplication.h> +#include <tdeconfig.h> +#include <kdebug.h> +#include <tdefontdialog.h> +#include <kcolordialog.h> +#include <tdelocale.h> +#include <tdepopupmenu.h> +#include <kiconloader.h> +#include <kstandarddirs.h> +#include <tdetempfile.h> + +#include <tdehtmlview.h> +#include <dom/dom_doc.h> +#include <dom/css_rule.h> + +#include <tqinputdialog.h> +#include <tqaction.h> +#include <tqlabel.h> +#include <tqfile.h> +#include <tqregexp.h> +#include <tqtextedit.h> +#include <tqtooltip.h> +#include <tqobjectlist.h> +#include <tqvaluelist.h> +#include <tqlayout.h> + +#include "datablocks/mixednumber.h" +#include "dialogs/borderdialog.h" +#include "exporters/htmlexporter.h" + +#include <cmath> + +KreDisplayItem::KreDisplayItem( const TQString &n, const TQString &_name ) : nodeId(n), name(_name) +{ + clear(); +} + +void KreDisplayItem::clear() +{ + alignment = TQt::AlignHCenter; + show = true; + backgroundColor = TQColor(255,255,255); + textColor = TQColor(0,0,0); + columns = 1; +} + +SetupDisplay::SetupDisplay( const Recipe &sample, TQWidget *parent ) : TDEHTMLPart(parent), + box_properties( new PropertiesMap ), + node_item_map( new TQMap<TQString, KreDisplayItem*> ), + has_changes( false ), + popup(0) +{ + connect( this, TQ_SIGNAL( popupMenu(const TQString &,const TQPoint &) ), TQ_SLOT( nodeClicked(const TQString &,const TQPoint &) ) ); + + if ( sample.recipeID != -1 ) + m_sample = sample; + else { + m_sample.title = i18n("Recipe Title"); + m_sample.yield.amount = 0; + m_sample.categoryList.append( Element(i18n( "Category 1, Category 2, ..." ) ) ); + m_sample.instructions = i18n("Instructions"); + m_sample.prepTime = TQTime(0,0); + + m_sample.authorList.append( Element(i18n( "Author 1, Author 2, ..." )) ); + + Ingredient ing; + ing.name = i18n("Ingredient 1"); + m_sample.ingList.append( ing ); + + ing.name = i18n("Ingredient 2"); + m_sample.ingList.append( ing ); + + ing.name = "..."; + m_sample.ingList.append( ing ); + + RatingCriteria rc; + Rating rating1; + rating1.rater = i18n("Rater"); + rating1.comment = i18n("Comment"); + + rc.name = i18n("Criteria 1"); + rc.stars = 5.0; + rating1.append(rc); + + rc.name = i18n("Criteria 2"); + rc.stars = 2.5; + rating1.append(rc); + + IngredientProperty prop; + prop.name = i18n("Property 1"); + m_sample.properties.append(prop); + prop.name = i18n("Property 2"); + m_sample.properties.append(prop); + prop.name = "..."; + m_sample.properties.append(prop); + + m_sample.ratingList.append(rating1); + } + + kdDebug()<<"first load"<<endl; + loadHTMLView(); + show(); + + createItem( "background", i18n("Background"), BackgroundColor ); + createItem( "title", i18n("Title"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "instructions", i18n("Instructions"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "prep_time", i18n("Preparation Time"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "photo", i18n("Photo"), Visibility | Border ); + createItem( "authors", i18n("Authors"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "categories", i18n("Categories"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "ingredients", i18n("Ingredients"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border | Columns ); + createItem( "properties", i18n("Properties"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border | Columns ); + createItem( "ratings", i18n("Ratings"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); + createItem( "yield", i18n("Yield"), Font | BackgroundColor | TextColor | Visibility | Alignment | Border ); +} + +SetupDisplay::~SetupDisplay() +{ + delete box_properties; + delete node_item_map; +} + +void SetupDisplay::loadHTMLView( const TQString &templateFile, const TQString &styleFile ) +{ + kdDebug()<<"loading template: "<<templateFile<<" style: "<<styleFile<<endl; + TQString tmp_filename = locateLocal( "tmp", "krecipes_recipe_view" ); + HTMLExporter exporter( tmp_filename + ".html", "html" ); + if ( templateFile != TQString::null ) + exporter.setTemplate( templateFile ); + if ( styleFile != TQString::null ) + exporter.setStyle( styleFile ); + + RecipeList recipeList; + recipeList.append(m_sample); + + TQFile file(tmp_filename + ".html"); + if ( file.open( IO_WriteOnly ) ) { + TQTextStream stream(&file); + exporter.writeStream(stream,recipeList); + } + else { + kdDebug()<<"Unable to open file for writing"<<endl; + } + file.close(); + + KURL url; + url.setPath( tmp_filename + ".html" ); + openURL( url ); + kdDebug() << "Opening URL: " << url.htmlURL() << endl; +} + +void SetupDisplay::reload() +{ + loadHTMLView( m_activeTemplate, m_activeStyle ); +} + +void SetupDisplay::loadTemplate( const TQString &filename ) +{ + bool storeChangedState = has_changes; + KTempFile tmpFile; + saveLayout(tmpFile.name()); + has_changes = storeChangedState; //saveLayout() sets changes to false + + loadHTMLView( filename, tmpFile.name() ); + + m_activeTemplate = filename; +} + +void SetupDisplay::createItem( const TQString &node, const TQString &name, unsigned int properties ) +{ + KreDisplayItem * item = new KreDisplayItem( node, name ); + box_properties->insert( item, properties ); + node_item_map->insert( node, item ); +} + +void SetupDisplay::loadLayout( const TQString &filename ) +{ + TQFile input( filename ); + if ( input.open( IO_ReadOnly ) ) { + TQDomDocument doc; + TQString error; + int line; + int column; + if ( !doc.setContent( &input, &error, &line, &column ) ) { + kdDebug() << TQString( i18n( "\"%1\" at line %2, column %3. This may not be a Krecipes layout file." ) ).arg( error ).arg( line ).arg( column ) << endl; + return ; + } + + m_styleSheet = DOM::CSSStyleSheet(); + + TQMap<TQString,KreDisplayItem*>::iterator it; + for ( it = node_item_map->begin(); it != node_item_map->end(); ++it ) { + it.data()->clear(); + } + processDocument( doc ); + + loadHTMLView(m_activeTemplate, filename); + m_activeStyle = filename; + + has_changes = false; + } + else + kdDebug() << "Unable to open file: " << filename << endl; +} + +void SetupDisplay::beginObject( const TQString &object ) +{ + TQMap<TQString, KreDisplayItem*>::iterator map_it = node_item_map->find( object ); + if ( map_it != node_item_map->end() ) + m_currentItem = map_it.data(); + else + m_currentItem = 0; +} + +void SetupDisplay::endObject() +{ + m_currentItem = 0; +} + +void SetupDisplay::loadBackgroundColor( const TQString &object, const TQColor &color ) +{ + if ( m_currentItem ) { + m_currentItem->backgroundColor = color; + m_styleSheet.insertRule("."+object+" { "+bgColorAsCSS(color)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadFont( const TQString &object, const TQFont &font ) +{ + if ( m_currentItem ) { + m_currentItem->font = font; + m_styleSheet.insertRule("."+object+" { "+fontAsCSS(font)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadTextColor( const TQString &object, const TQColor &color ) +{ + if ( m_currentItem ) { + m_currentItem->textColor = color; + m_styleSheet.insertRule("."+object+" { "+textColorAsCSS(color)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadVisibility( const TQString &object, bool visible ) +{ + if ( m_currentItem ) { + m_currentItem->show = visible; + emit itemVisibilityChanged( m_currentItem, visible ); + + m_styleSheet.insertRule("."+object+" { "+visibilityAsCSS(visible)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadAlignment( const TQString &object, int alignment ) +{ + if ( m_currentItem ) { + m_currentItem->alignment = alignment; + m_styleSheet.insertRule("."+object+" { "+alignmentAsCSS(alignment)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadBorder( const TQString &object, const KreBorder& border ) +{ + if ( m_currentItem ) { + m_currentItem->border = border; + m_styleSheet.insertRule("."+object+" { "+borderAsCSS(border)+" }",m_styleSheet.cssRules().length()); + } +} + +void SetupDisplay::loadColumns( const TQString &/*object*/, int cols ) +{ + if ( m_currentItem ) { + m_currentItem->columns = cols; + } +} + +void SetupDisplay::saveLayout( const TQString &filename ) +{ + TQDomImplementation dom_imp; + TQDomDocument doc = dom_imp.createDocument( TQString::null, "krecipes-layout", dom_imp.createDocumentType( "krecipes-layout", TQString::null, TQString::null ) ); + + TQDomElement layout_tag = doc.documentElement(); + layout_tag.setAttribute( "version", 0.4 ); + //layout_tag.setAttribute( "generator", TQString("Krecipes v%1").arg(krecipes_version()) ); + doc.appendChild( layout_tag ); + + for ( TQMap<TQString, KreDisplayItem*>::const_iterator it = node_item_map->begin(); it != node_item_map->end(); ++it ) { + TQDomElement base_tag = doc.createElement( it.key() ); + layout_tag.appendChild( base_tag ); + + int properties = (*box_properties)[it.data()]; + if ( properties & BackgroundColor ) { + TQDomElement backgroundcolor_tag = doc.createElement( "background-color" ); + backgroundcolor_tag.appendChild( doc.createTextNode( it.data()->backgroundColor.name() ) ); + base_tag.appendChild( backgroundcolor_tag ); + } + + if ( properties & TextColor ) { + TQDomElement textcolor_tag = doc.createElement( "text-color" ); + textcolor_tag.appendChild( doc.createTextNode( it.data()->textColor.name() ) ); + base_tag.appendChild( textcolor_tag ); + } + + if ( properties & Font ) { + TQDomElement font_tag = doc.createElement( "font" ); + font_tag.appendChild( doc.createTextNode( it.data()->font.toString() ) ); + base_tag.appendChild( font_tag ); + } + + if ( properties & Visibility ) { + TQDomElement visibility_tag = doc.createElement( "visible" ); + visibility_tag.appendChild( doc.createTextNode( (it.data()->show) ? "true" : "false" ) ); + base_tag.appendChild( visibility_tag ); + } + + if ( properties & Alignment ) { + TQDomElement alignment_tag = doc.createElement( "alignment" ); + alignment_tag.appendChild( doc.createTextNode( TQString::number( it.data()->alignment ) ) ); + base_tag.appendChild( alignment_tag ); + } + + if ( properties & Border ) { + TQDomElement border_tag = doc.createElement( "border" ); + border_tag.setAttribute( "width", it.data()->border.width ); + border_tag.setAttribute( "style", it.data()->border.style ); + border_tag.setAttribute( "color", it.data()->border.color.name() ); + base_tag.appendChild( border_tag ); + } + + if ( properties & Columns ) { + TQDomElement columns_tag = doc.createElement( "columns" ); + columns_tag.appendChild( doc.createTextNode( TQString::number( it.data()->columns ) ) ); + base_tag.appendChild( columns_tag ); + } + } + + TQFile out_file( filename ); + if ( out_file.open( IO_WriteOnly ) ) { + has_changes = false; + + TQTextStream stream( &out_file ); + stream << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" << doc.toString(); + } + else + kdDebug() << "Error: Unable to write to file " << filename << endl; +} + +void SetupDisplay::begin(const KURL &url, int xOffset, int yOffset) +{ + kdDebug()<<"begin"<<endl; + TDEHTMLPart::begin(url,xOffset,yOffset); + kdDebug()<<"end"<<endl; + + DOM::Document doc = document(); + DOM::DOMImplementation impl = doc.implementation(); + kdDebug() << "(1) document: " << document().handle() << endl; + #if 0 + if ( !impl.isNull() ) { + //m_styleSheet = impl.createCSSStyleSheet("-krecipes","screen"); + //m_styleSheet = DOM::CSSStyleSheet(); + //doc.addStyleSheet(m_styleSheet); + //applyStylesheet(); + } + #endif +} + +void SetupDisplay::nodeClicked(const TQString &/*url*/,const TQPoint &point) +{ + DOM::Node node = nodeUnderMouse(); + DOM::Element element; + if ( node.nodeType() != DOM::Node::ELEMENT_NODE ) { + kdDebug()<<"not an element"<<endl; + element = (DOM::Element)node.parentNode(); + } + else + element = (DOM::Element)node; + + while ( !element.parentNode().isNull() ) { + if ( element.hasAttribute("class") ) { + TQString id = element.getAttribute("class").string(); + if ( node_item_map->keys().contains(id) ) + break; + } + + element = (DOM::Element)element.parentNode(); + } + + m_currNodeId = element.getAttribute("class").string(); + if ( m_currNodeId.isEmpty() ) { + kdDebug()<<"Code error: unable to determine class of selected element"<<endl; + return; + } + + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + + delete popup; + popup = new TDEPopupMenu( view() ); + popup->insertTitle( item->name ); + + unsigned int properties = 0; + for ( PropertiesMap::const_iterator it = box_properties->begin(); it != box_properties->end(); ++it ) { + if ( it.key()->nodeId == m_currNodeId ) { + properties = it.data(); + break; + } + } + + TDEIconLoader il; + + if ( properties & BackgroundColor ) + popup->insertItem( i18n( "Background Color..." ), this, TQ_SLOT( setBackgroundColor() ) ); + + if ( properties & TextColor ) + popup->insertItem( i18n( "Text Color..." ), this, TQ_SLOT( setTextColor() ) ); + + if ( properties & Font ) + popup->insertItem( il.loadIconSet( "text", TDEIcon::Small, 16 ), i18n( "Font..." ), this, TQ_SLOT( setFont() ) ); + + if ( properties & Visibility ) { + int id = popup->insertItem( i18n( "Show" ), this, TQ_SLOT( setShown( int ) ) ); + popup->setItemChecked( id, item->show ); + } + + if ( properties & Alignment ) { + TQPopupMenu * sub_popup = new TQPopupMenu( popup ); + + TQActionGroup *alignment_actions = new TQActionGroup( this ); + alignment_actions->setExclusive( true ); + + TQAction *c_action = new TQAction( i18n( "Center" ), i18n( "Center" ), 0, alignment_actions, 0, true ); + TQAction *l_action = new TQAction( i18n( "Left" ), i18n( "Left" ), 0, alignment_actions, 0, true ); + TQAction *r_action = new TQAction( i18n( "Right" ), i18n( "Right" ), 0, alignment_actions, 0, true ); + + int align = item->alignment; + if ( align & TQt::AlignHCenter ) + c_action->setOn(true); + if ( align & TQt::AlignLeft ) + l_action->setOn(true); + if ( align & TQt::AlignRight ) + r_action->setOn(true); + + connect( alignment_actions, TQ_SIGNAL( selected( TQAction* ) ), TQ_SLOT( setAlignment( TQAction* ) ) ); + + popup->insertItem( i18n( "Alignment" ), sub_popup ); + + alignment_actions->addTo( sub_popup ); + } + + if ( properties & Border ) + popup->insertItem( i18n( "Border..." ), this, TQ_SLOT( setBorder() ) ); + + if ( properties & Columns ) + popup->insertItem( i18n( "Columns..." ), this, TQ_SLOT( setColumns() ) ); + + popup->popup( point ); +} + +void SetupDisplay::applyStylesheet() +{ + loadTemplate( m_activeTemplate ); + if ( !document().isNull() && !m_styleSheet.isNull() ) { + //document().removeStyleSheet(m_styleSheet); + //document().addStyleSheet(m_styleSheet); + } +} + +void SetupDisplay::setBackgroundColor() +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + if ( KColorDialog::getColor( item->backgroundColor, view() ) == TQDialog::Accepted ) { + m_currentItem = item; + loadBackgroundColor(m_currNodeId,item->backgroundColor); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; + } +} + +void SetupDisplay::setBorder() +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + BorderDialog borderDialog( item->border, view() ); + if ( borderDialog.exec() == TQDialog::Accepted ) { + m_currentItem = item; + loadBorder( m_currNodeId, borderDialog.border() ); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; + } +} + +void SetupDisplay::setColumns() +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + int cols = TQInputDialog::getInteger( TQString::null, i18n("Select the number of columns to use:"), item->columns, 1, 100, 1, 0, view() ); + if ( cols > 0 ) { + m_currentItem = item; + loadColumns( m_currNodeId, cols ); + m_currentItem = 0; + + loadTemplate( m_activeTemplate ); + has_changes = true; + } +} + +void SetupDisplay::setTextColor() +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + if ( KColorDialog::getColor( item->textColor, view() ) == TQDialog::Accepted ) { + m_currentItem = item; + loadTextColor(m_currNodeId,item->textColor); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; + } +} + +void SetupDisplay::setShown( int id ) +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + emit itemVisibilityChanged( item, !popup->isItemChecked( id ) ); + + m_currentItem = item; + loadVisibility(m_currNodeId,!popup->isItemChecked( id )); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; +} + +void SetupDisplay::setFont() +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + if ( TDEFontDialog::getFont( item->font, false, view() ) == TQDialog::Accepted ) { + m_currentItem = item; + loadFont(m_currNodeId,item->font); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; + } +} + +void SetupDisplay::setAlignment( TQAction *action ) +{ + KreDisplayItem *item = *node_item_map->find( m_currNodeId ); + + //TODO: isn't there a simpler way to do this... + //preserve non-horizontal alignment flags + if ( item->alignment & TQt::AlignRight ) + item->alignment ^= TQt::AlignRight; + if ( item->alignment & TQt::AlignHCenter ) + item->alignment ^= TQt::AlignHCenter; + if ( item->alignment & TQt::AlignLeft ) + item->alignment ^= TQt::AlignLeft; + + if ( action->text() == i18n( "Center" ) ) + item->alignment |= TQt::AlignHCenter; + else if ( action->text() == i18n( "Left" ) ) + item->alignment |= TQt::AlignLeft; + else if ( action->text() == i18n( "Right" ) ) + item->alignment |= TQt::AlignRight; + + m_currentItem = item; + loadAlignment(m_currNodeId,item->alignment); + m_currentItem = 0; + + applyStylesheet(); + has_changes = true; +} + +void SetupDisplay::setItemShown( KreDisplayItem *item, bool visible ) +{ + item->show = visible; + + m_styleSheet.insertRule("."+item->nodeId+" { visibility:"+(item->show?"visible":"hidden")+" }",m_styleSheet.cssRules().length()); + applyStylesheet(); + + has_changes = true; +} + +void SetupDisplay::changeMade( void ) +{ + has_changes = true; +} + +#include "setupdisplay.moc" |