/*
* PDFedit - free program for PDF document manipulation.
* Copyright (C) 2006, 2007 PDFedit team: Michal Hocko,
* Miroslav Jahoda,
* Jozef Misutka,
* Martin Petricek
*
* Project is hosted on http://sourceforge.net/projects/pdfedit
*/
/** @file
Checker and translation generator of menu configuration
This is helper utility used to:
- check menus for translatable strings and write them to .menu-trans.h,
so they will be found by lupdate utility
- check menus for unreferenced items
@author Martin Petricek
*/
#include
#include
#include
#include
#include
#include
#include "config.h"
#include "util.h"
#include "menu.h"
#include "menugenerator.h"
using namespace std;
using namespace util;
/** Constructor */
MenuGenerator::MenuGenerator() {
set=new gui::StaticSettings();
//generate to/from current directory
set->tryLoad("pdfeditrc");
}
/** Destructor */
MenuGenerator::~MenuGenerator() {
delete set;
}
/**
Check if given name is a "special item" (or separator)
@param itemName Name of the item
@return true if the item is special, false if not.
*/
bool MenuGenerator::special(const QString &itemName) {
if (itemName=="") return true;
if (itemName=="-") return true;
if (itemName.startsWith("_")) return true;
return false;
}
/**
Set menu item as "reachable" (increases its reference count) and add translation on it.
Recursively run on subitems if item is list
@param name Id of menu item
*/
void MenuGenerator::setAvail(const QString &name) {
if (special(name)) return; //return if separator
avail[name]+=1;
if (avail[name]>=2) return; //already seen this one
QString line=set->readEntry("gui/items/"+name);
line=line.simplifyWhiteSpace();
if (line.startsWith("list ")) { // List of values - a submenu, first is name of submenu, others are items in it
line=line.remove(0,5);
QStringList qs=explode(gui::MENULIST_SEPARATOR,line);
QStringList::Iterator it=qs.begin();
if (it!=qs.end()) {
if (!special(*it)) { //not a separator or special item
addLocString(name,*it);
}
++it;
} else fatalError("Invalid menu item in config:\n"+line);
for (;it!=qs.end();++it) { //load all subitems
setAvail(*it);
}
} else if (line.startsWith("label ")) { // A single item
line=line.remove(0,6);
addLocString(name,line);
} else if (line.startsWith("item ")) { // A single item
line=line.remove(0,5);
QStringList qs=explode(gui::MENUDEF_SEPARATOR,line,true);
addLocString(name,qs[0]);
if (qs.count()<2) fatalError("Invalid menu item in config:\n"+line);
} else { //something invalid
fatalError("Invalid menu item in config:\n"+line);
}
}
/**
Check menu structure, print items and their reference counts
Warn about unreferenced items
*/
void MenuGenerator::check() {
QStringList items=set->entryList("gui/items");
QString toolBarList=set->readEntry("gui/toolbars");
toolBarList=toolBarList.simplifyWhiteSpace();
QStringList toolb=QStringList::split(",",toolBarList);
//Toolbars are root items
for (QStringList::Iterator it=toolb.begin();it!=toolb.end();++it) {
setAvail(*it);
}
//Main menu is root item
setAvail("MainMenu");
int ava;
for (QStringList::Iterator it=items.begin();it!=items.end();++it) {
cout << "Item : ";
cout.width(20);
cout.flags(ios::left);
cout << convertFromUnicode(*it,CON);
ava=avail[*it];
if (!ava) cout << " (unreachable!)";
else cout << " (" << ava << " refs)";
cout << endl;
}
}
/**
Add menu to localization list
@param id Id of menu item
@param name Caption of menu item
*/
void MenuGenerator::addLocString(const QString &id,const QString &name) {
trans+=QString("QT_TRANSLATE_NOOP( \"gui::Settings\",\"")+name+"\",\""+id+"\")";
cout << convertFromUnicode(id,CON) << " = " << convertFromUnicode(name,CON) << endl;
}
/** Produce dummy header used for menu items localization */
void MenuGenerator::translate() {
check();
QString trx=trans.join("\n")+"\n";
QFile file(".menu-trans.h");
if ( file.open( IO_WriteOnly ) ) {
QTextStream stream( &file );
stream << "//File automatically generated by menugenerator from pdfeditrc" << endl;
stream << "//Do not edit, any changes will be overwritten" << endl;
stream << trx;
file.close();
} else {
fatalError("Cannot open file on write!");
}
}
/**
Main function of menugenerator utility
@param argc Argument count
@param argv Commandline arguments
@return Executable return code
*/
int main(int argc, char *argv[]){
MenuGenerator m;
cout << " \"menugenerator\" to check menus" <1) {
if (strcmp(argv[1],"-trans")==0) {
cout << "Checking menu" << endl;
m.translate();
cout << "Done checking menu" << endl;
}
} else { //check menus, do localization
cout << "Checking menu" << endl;
//TODO: check accelerator conflicts in single menu
m.check();
cout << "Done checking menu" << endl;
}
}