// $Id: custom.cc,v 1.14 2004/05/10 14:08:21 christof Exp $ /* glade--: C++ frontend for glade (Gtk+ User Interface Builder) * Copyright (C) 1998 Christof Petig * Copyright (C) 1999-2000 Adolf Petig GmbH & Co. KG, written by Christof Petig * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "widget.hh" class Custom : public Gtk_Widget {public: typedef Gtk_Widget Parent; virtual const std::string TypeName(const Widget &w) const; virtual void GHInclude(const Widget &w, CxxFile &f) const; Custom(); virtual bool NeedExplicitCtor(const Widget &w) const; virtual void ConstructionArgs(const Widget &w, CxxFile &f) const; virtual bool CanBeManaged(const Widget &w) const { return false; } const std::string SignalHandlerArgs(const Widget &w,const std::string &signal,std::string &rettype,std::string &scope) const; virtual bool isProxySignal(const Widget &w,std::string &method,bool after)const; }; static Custom Custom; // 'A(x)' -> 'A' const std::string Custom::TypeName(const Widget &w) const { std::string creation_function(w.getProperty("creation_function")); std::string::iterator bra(find(creation_function.begin(),creation_function.end(),'(')); if (bra!=creation_function.end()) creation_function.erase(bra,creation_function.end()); return creation_function; } // 'A(x)' -> 'A.hh' void Custom::GHInclude(const Widget &w, CxxFile &f) const { std::string creation_function(w.getProperty("creation_function")); std::string::iterator bra(find(creation_function.begin(),creation_function.end(),'(')); std::string::iterator bra2(find(creation_function.begin(),creation_function.end(),'<')); if (bra2(x)' -> 'x' or use C tags // fix for 'A(X(y))' -> 'X(y)' void Custom::ConstructionArgs(const Widget &w, CxxFile &f) const { const std::string creation_function(w.getProperty("creation_function")); std::string::const_iterator bra(find(creation_function.begin(),creation_function.end(),'(')); if (bra!=creation_function.end()) { bra++; std::string::const_reverse_iterator ket(find(creation_function.rbegin(),std::string::const_reverse_iterator(bra),')')); if (*ket==')') ket++; f.FunctionArg() << std::string(bra,ket.base()); } else { const std::string string1(w.getProperty("string1")); int int1(w.getIntProperty("int1")); const std::string string2(w.getProperty("string2")); int int2(w.getIntProperty("int2")); if (!string1.empty()) f.FunctionArg() << Configuration.CString_WithQuotes(string1); if (int1) f.FunctionArg() << int1; if (!string2.empty()) f.FunctionArg() << Configuration.CString_WithQuotes(string2); if (int2) f.FunctionArg() << int2; if (string1.empty() && string2.empty() && !int1 && !int2) f.FunctionArg(); } } bool Custom::NeedExplicitCtor(const Widget &w) const { return true; } const std::string Custom::SignalHandlerArgs(const Widget &w,const std::string &signal,std::string &rettype,std::string &scope) const { scope=TypeName(w); reloop: if (Configuration.debug) std::cerr << "searching for signal " << signal << " in " << scope << '\n'; if (Writer.find(scope)!=Writer.end()) { return LookupWriter(scope).SignalHandlerArgs(w,signal,rettype,scope); } else FOR_EACH_CONST_TAG(i,Configuration.custom_signal_args) { if (i->Type()!="class") continue; if (i->getAttr("name")!=scope) continue; FOR_EACH_CONST_TAG(j, *i) { if (j->Type()!="callback") continue; if (j->getAttr("name")!=signal) continue; if (j->hasAttr("result")) rettype=j->getAttr("result"); return j->getAttr("args"); } scope=i->getAttr("parent"); if (!scope.empty()) goto reloop; } return Parent::SignalHandlerArgs(w,signal,rettype,scope); } bool Custom::isProxySignal(const Widget &w,std::string &method,bool after) const { std::string scope=TypeName(w); reloop: if (Configuration.debug) std::cerr << "searching for signal " << method << " in " << scope << '\n'; if (Writer.find(scope)!=Writer.end()) { bool is_signal=false; if (isInternalMethod(w,method,"",scope,is_signal) && is_signal) return LookupWriter(scope).isProxySignal(w,method,after); // if signal is unknown default to non-proxy return false; } else FOR_EACH_CONST_TAG(i,Configuration.custom_signal_args) { if (i->Type()!="class") continue; if (i->getAttr("name")!=scope) continue; FOR_EACH_CONST_TAG(j, *i) { if (j->Type()!="callback") continue; if (j->getAttr("name")!=method) continue; return j->getBoolAttr("proxy",false); } scope=i->getAttr("parent"); if (!scope.empty()) goto reloop; } return false; }