/*************************************************************************** * Copyright (C) 2003-2005 * * Jason Kivlighn (jkivlighn@gmail.com) * * * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "datablocks/mixednumber.h" #include "dialogs/borderdialog.h" #include "exporters/htmlexporter.h" #include 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 ), 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"<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::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::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::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 << "\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"<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"<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"