/*
*
* ProLinga-Run
*
* Copyright (C) 2002-2008 Xobas Software.
* All rights reserved.
*
* This file is part of ProLinga-Run.
*
* ProLinga-Run 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 3 of the License, or
* (at your option) any later version.
*
* ProLinga-Run 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 ProLinga-Run. If not, see .
*
* More information is available at the following addresses:
*
* Website : http://www.prolinga.org
*
* Email : prolinga-list@prolinga.org
*
*
*/
#include "RunCommon.h"
#include
#include
#include
#include
#include "RunShare.hpp"
extern ScreenStackPtr dialogStackPtr;
void ToLower(char *inString)
{
int length, i;
length = strlen(inString);
for (i = 0; i < length; i++)
inString[i] = tolower(inString[i]);
}
int ReplaceCharInString(char *string, char find, char replace)
{
int count = 0;
for(;*string;string++)
{
if (*string == find)
{
count ++;
*string = replace;
}
}
return count;
}
bool DialogConfirm(GtkWidget *openwindow, gchar *message)
{
GtkWidget *dialog;
gint result;
bool confirmStatus;
dialog = gtk_message_dialog_new (GTK_WINDOW(openwindow),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_OK_CANCEL,
message);
result = gtk_dialog_run (GTK_DIALOG (dialog));
if (result == GTK_RESPONSE_OK)
confirmStatus = true;
else
confirmStatus = false;
gtk_widget_destroy (dialog);
return confirmStatus;
}
void DialogError(GtkWidget *openwindow, gchar *message)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new (GTK_WINDOW(openwindow),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
message);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
GtkWidget* LookupWidget(GtkWidget *widget, const gchar *widget_name)
{
GladeXML *xml;
GList *wdgList;
GtkWidget *wdgt;
xml = glade_get_widget_tree(widget);
wdgt = glade_xml_get_widget(xml, widget_name);
wdgList = glade_xml_get_widget_prefix(xml, "");
/*
if (strcmp((char *)widget_name, "External") == 0)
{
lengthWdgList = g_list_length(wdgList);
for (i = 1; i < lengthWdgList; i++)
{
tmpWdg = GTK_WIDGET(g_list_nth_data(wdgList, i));
printf("WIDGET : %s NAME : %s\n", G_OBJECT_TYPE_NAME(G_OBJECT(tmpWdg)), gtk_widget_get_name(tmpWdg));
}
}
*/
if(wdgt == NULL)
g_warning ("Widget not found: %s", widget_name);
return wdgt;
}
char* CreateGladeString(xmlDocPtr doc)
{
xmlDocPtr docScreen;
xmlNodePtr cur, curScreen;
xmlBufferPtr buf;
char *string;
cur = xmlDocGetRootElement(doc);
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "Repository"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "Command"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "Object"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "Screen"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "DisplayData"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if (!xmlStrcmp(cur->name, (const xmlChar *) "glade-interface"))
break;
cur = cur->next;
}
cur = cur->xmlChildrenNode;
docScreen = xmlNewDoc((const xmlChar *)"1.0");
docScreen->children = xmlNewDocNode(docScreen, NULL, (const xmlChar *)"glade-interface", NULL);
curScreen = xmlDocGetRootElement(docScreen);
xmlAddChild(curScreen, xmlCopyNodeList(cur));
curScreen = xmlDocGetRootElement(docScreen);
/* Dump to string */
buf = xmlBufferCreate();
xmlNodeDump(buf, docScreen, curScreen, 0, 1);
string = new char[strlen((char *)xmlBufferContent(buf))+1];
strcpy(string, (char *)xmlBufferContent(buf));
/* Free */
xmlBufferFree(buf);
xmlFreeDoc(docScreen);
/* Return */
return string;
}
void ResetScreenStack(void)
{
/* Delete dialog stack */
dialogStackPtr->deleteStack(&dialogStackPtr);
}
ScreenStack::ScreenStack()
{
prevScreenPtr = NULL;
nextPtr = NULL;
}
ScreenStack::~ScreenStack()
{
/* Nothing ? */
}
void ScreenStack::push(ScreenStack **topPtr, GtkWidget *screenPtr)
{
ScreenStack *newPtr;
newPtr = new ScreenStack;
newPtr->prevScreenPtr = screenPtr;
newPtr->nextPtr = *topPtr;
*topPtr = newPtr;
}
void ScreenStack::pop(ScreenStack **topPtr, GtkWidget **screenPtr)
{
ScreenStack *tmpPtr;
tmpPtr = *topPtr;
*screenPtr = tmpPtr->prevScreenPtr;
*topPtr = (*topPtr)->nextPtr;
delete tmpPtr;
}
void ScreenStack::deleteStack(ScreenStack **topPtr)
{
ScreenStack *tmpPtr;
while (*topPtr != NULL)
{
tmpPtr = *topPtr;
*topPtr = (*topPtr)->nextPtr;
delete tmpPtr;
}
}
void ScreenStack::get(ScreenStack **topPtr, GtkWidget **screenPtr)
{
*screenPtr = (*topPtr)->prevScreenPtr;
}
DesktopScreen::DesktopScreen()
{
strcpy(screenName, "");
screenWidget = NULL;
nextPtr = NULL;
}
DesktopScreen::~DesktopScreen()
{
/* Nothing ? */
}
GtkWidget *DesktopScreen::getOneValue(DesktopScreenPtr *dtsPtr, const char *name)
{
DesktopScreenPtr curPtr;
curPtr = *dtsPtr;
while (curPtr != NULL)
{
if (strcmp(curPtr->screenName, name) == 0)
return curPtr->screenWidget;
curPtr= curPtr->nextPtr;
}
return NULL;
}
void DesktopScreen::putValue(DesktopScreenPtr *dtsPtr, const char *name, const GtkWidget *wdgScreen)
{
DesktopScreenPtr newPtr;
/* Prepend value to list. Double allowed (multiple modeless) */
newPtr = new DesktopScreen;
strcpy(newPtr->screenName, name);
newPtr->screenWidget = GTK_WIDGET(wdgScreen);
newPtr->nextPtr = *dtsPtr;
*dtsPtr = newPtr;
}
void DesktopScreen::deleteValue(DesktopScreenPtr *dtsPtr, const char *name, const GtkWidget *wdgScreen)
{
DesktopScreenPtr curPtr, prevPtr;
curPtr = *dtsPtr;
prevPtr = NULL;
while (curPtr != NULL)
{
if ((strcmp(curPtr->screenName, name) == 0) && (GTK_WIDGET(curPtr->screenWidget) == GTK_WIDGET(wdgScreen)))
{
if (prevPtr == NULL)
{
/* First Record */
*dtsPtr = curPtr->nextPtr;
break;
}
else
{
prevPtr->nextPtr = curPtr->nextPtr;
break;
}
delete curPtr;
}
prevPtr = curPtr;
curPtr = curPtr->nextPtr;
}
}
GtkWidget *DesktopScreen::getFirstValue(DesktopScreenPtr *dtsPtr)
{
if (*dtsPtr != NULL)
return (*dtsPtr)->screenWidget;
else
return NULL;
}
int DesktopScreen::isOnDesktop(DesktopScreenPtr dtsPtr, const char *name)
{
DesktopScreenPtr curPtr;
int hits = 0;
/* Check if and how many times screen name exits in mem list */
curPtr = dtsPtr;
while (curPtr != NULL)
{
if (strcmp(curPtr->screenName, name) == 0)
hits++;
curPtr= curPtr->nextPtr;
}
return hits;
}
int DesktopScreen::numberOnDesktop(DesktopScreenPtr dtsPtr)
{
DesktopScreenPtr curPtr;
int hits = 0;
curPtr = dtsPtr;
while (curPtr != NULL)
{
hits++;
curPtr= curPtr->nextPtr;
}
return hits;
}
void DesktopScreen::printList(DesktopScreenPtr dtsPtr) const
{
DesktopScreenPtr curPtr;
curPtr = dtsPtr;
while (curPtr != NULL)
{
printf("Screen Name %s\n", curPtr->screenName);
curPtr = curPtr->nextPtr;
}
}