You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeaddons/konq-plugins/sidebar/metabar/src/metabarfunctions.cpp

243 lines
7.0 KiB

/***************************************************************************
* Copyright (C) 2005 by Florian Roth *
* florian@synatic.net *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "metabarfunctions.h"
#include <html_element.h>
#include <html_document.h>
#include <css_value.h>
#include <tdeconfig.h>
#include <tqrect.h>
#define CSS_PRIORITY "important"
#define RESIZE_SPEED 5
#define RESIZE_STEP 2
MetabarFunctions::MetabarFunctions(KHTMLPart *html, TQObject *parent, const char* name) : TQObject(parent, name), m_html(html)
{
timer = new TQTimer(this);
connect(timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(animate()));
}
MetabarFunctions::~MetabarFunctions()
{
if(timer->isActive()){
timer->stop();
}
}
void MetabarFunctions::handleRequest(const KURL &url)
{
TQString function = url.host();
TQStringList params = TQStringList::split(',', url.filename());
if(function == "toggle"){
if(params.size() == 1){
toggle(params.first());
}
}
else if(function == "adjustSize"){
if(params.size() == 1){
adjustSize(params.first());
}
}
else if(function == "show"){
if(params.size() == 1){
show(params.first());
}
}
else if(function == "hide"){
if(params.size() == 1){
hide(params.first());
}
}
}
void MetabarFunctions::toggle(DOM::DOMString item)
{
DOM::HTMLDocument doc = m_html->htmlDocument();
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
if(!node.isNull()){
DOM::NodeList children = node.childNodes();
DOM::CSSStyleDeclaration style = node.style();
DOM::DOMString expanded = node.getAttribute("expanded");
bool isExpanded = expanded == "true";
int height = 0;
if(!isExpanded){
height = getHeight(node);
}
DOM::DOMString att = isExpanded ? "false" : "true";
node.setAttribute("expanded", att);
TDEConfig config("metabarrc");
config.setGroup("General");
if(config.readBoolEntry("AnimateResize", false)){
resizeMap[item.string()] = height;
if(!timer->isActive()){
timer->start(RESIZE_SPEED);
}
}
else{
style.setProperty("height", TQString("%1px").arg(height), CSS_PRIORITY);
}
}
}
void MetabarFunctions::adjustSize(DOM::DOMString item)
{
DOM::HTMLDocument doc = m_html->htmlDocument();
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
if(!node.isNull()){
DOM::NodeList children = node.childNodes();
DOM::CSSStyleDeclaration style = node.style();
DOM::DOMString expanded = node.getAttribute("expanded");
bool isExpanded = expanded == "true";
if(isExpanded){
int height = getHeight(node);
TDEConfig config("metabarrc");
config.setGroup("General");
if(config.readBoolEntry("AnimateResize", false)){
resizeMap[item.string()] = height;
if(!timer->isActive()){
timer->start(RESIZE_SPEED);
}
}
else{
style.setProperty("height", TQString("%1px").arg(height), CSS_PRIORITY);
}
}
}
}
void MetabarFunctions::animate()
{
TQMap<TQString, int>::Iterator it;
for(it = resizeMap.begin(); it != resizeMap.end(); ++it ) {
TQString id = it.key();
int height = it.data();
int currentHeight = 0;
DOM::HTMLDocument doc = m_html->htmlDocument();
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(id));
DOM::CSSStyleDeclaration style = node.style();
TQString currentHeightString = style.getPropertyValue("height").string();
if(currentHeightString.endsWith("px")){
currentHeight = currentHeightString.left(currentHeightString.length() - 2).toInt();
}
if(currentHeight == height){
resizeMap.remove(id);
if(resizeMap.isEmpty()){
timer->stop();
}
}
else{
int diff = kAbs(currentHeight - height);
int changeValue = RESIZE_STEP;
if(diff < RESIZE_STEP){
changeValue = diff;
}
int change = currentHeight < height ? changeValue : -changeValue;
style.setProperty("height", TQString("%1px").arg(currentHeight + change), CSS_PRIORITY);
doc.updateRendering();
}
}
}
void MetabarFunctions::show(DOM::DOMString item)
{
DOM::HTMLDocument doc = m_html->htmlDocument();
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
if(!node.isNull()){
DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(node.parentNode());
DOM::CSSStyleDeclaration style = parent.style();
style.setProperty("display", "block", CSS_PRIORITY);
}
}
void MetabarFunctions::hide(DOM::DOMString item)
{
DOM::HTMLDocument doc = m_html->htmlDocument();
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
if(!node.isNull()){
DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(node.parentNode());
DOM::CSSStyleDeclaration style = parent.style();
style.setProperty("display", "none", CSS_PRIORITY);
}
}
int MetabarFunctions::getHeight(DOM::HTMLElement &element)
{
int height = 0;
DOM::NodeList children = element.childNodes();
for(uint i = 0; i < children.length(); i++){
DOM::HTMLElement node = static_cast<DOM::HTMLElement>(children.item(i));
DOM::CSSStyleDeclaration style = node.style();
DOM::DOMString css_height = style.getPropertyValue("height");
if(!css_height.isNull()){
height += css_height.string().left(css_height.string().length() - 2).toInt();
}
else{
int h = 0;
if(!node.isNull()){
h = node.getRect().height();
}
DOM::DOMString display = style.getPropertyValue("display");
if(display == "none"){
h = 0;
}
else if(h == 0){
h = 20;
}
height += h;
}
}
return height;
}
#include "metabarfunctions.moc"