iup-stack/iup/srcvled/iup_vled.c

3566 lines
105 KiB
C
Executable File
Raw Blame History

#if 0
/* To check for memory leaks */
#define VLD_MAX_DATA_DUMP 80
#include <vld.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <iup.h>
#include <iupim.h>
#include <iupcbs.h>
#include <iup_scintilla.h>
#include <iup_config.h>
#include <iupcontrols.h>
/* #define USE_NO_OPENGL */
/* #define USE_NO_WEB */
/* #define USE_NO_PLOT */
#ifndef USE_NO_OPENGL
#include <iupgl.h>
#include <iupglcontrols.h>
#endif
#ifndef USE_NO_WEB
#include <iupweb.h>
#endif
#ifndef USE_NO_PLOT
#include <iup_plot.h>
#endif
#if _MSC_VER > 1900 /* Visual Studio 2017 and newer */
#define USE_UTF8_VC
#include <locale.h>
#endif
#include "iup_str.h"
#include "iup_object.h"
#include "iup_ledlex.h"
#include "iup_attrib.h"
#include "iup_image.h"
#include "iup_dlglist.h"
#include "iup_register.h"
#include "iup_layout.h"
#include "iup_array.h"
#include "iup_linefile.h"
void vLedLoadImages(void);
Ihandle* vLedImageEditorCreate(Ihandle* parent, Ihandle *config);
void vLedImageEditorNewImage(Ihandle* dlg, const char* filename);
void vLedImageEditorSetImage(Ihandle* dlg, Ihandle* iup_image, const char* name);
#define VLED_FOLDING_MARGIN "20"
#define vled_isprint(_c) ((_c) > 31 && (_c) < 127 && _c != 40 && _c != '(' && _c != ')' && _c != '[' && _c != ']' && _c != ',')
enum {
FIND_TYPE = 0,
FIND_HANDLE = 1,
FIND_NAME = 2,
FIND_TITLE = 3,
FIND_ATTRIBUTE = 4
};
static int compare_image_names(const void* i1, const void* i2)
{
Ihandle* ih1 = *((Ihandle**)i1);
Ihandle* ih2 = *((Ihandle**)i2);
char* name1 = IupGetName(ih1);
char* name2 = IupGetName(ih2);
return strcmp(name1, name2);
}
static char* vLedGetName(Ihandle* ih)
{
char* name = IupGetName(ih);
if (name && iupStrEqualPartial(name, "_IUP_NAME")) /* ignore internal names */
return NULL;
return name;
}
static int compare_named_handles(const void* i1, const void* i2)
{
Ihandle* ih1 = *((Ihandle**)i1);
Ihandle* ih2 = *((Ihandle**)i2);
int line1 = iupAttribGetInt(ih1, "_IUPLED_LINE");
int line2 = iupAttribGetInt(ih2, "_IUPLED_LINE");
return line1-line2;
}
static const char* get_img_fileformat(void)
{
#define NUM_FORMATS 4
int ret, count = NUM_FORMATS;
static const char *options[NUM_FORMATS] = {
"ICO",
"BMP",
"GIF",
"PNG"
};
ret = IupListDialog(1, "Image File Format", count, options, 1, 9, count + 1, NULL);
if (ret == -1)
return NULL;
else
return options[ret];
}
static Ihandle* get_config(Ihandle* ih)
{
Ihandle* config = (Ihandle*)IupGetAttribute(IupGetDialog(ih), "CONFIG_HANDLE");
return config;
}
static char* getfolder(Ihandle* ih)
{
static char folder[10240];
Ihandle *filedlg = IupFileDlg();
Ihandle* config = get_config(ih);
const char* dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastExportDirectory");
if (!dir) dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastDirectory");
IupSetAttribute(filedlg, "DIALOGTYPE", "DIR");
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttributeHandle(filedlg, "PARENTDIALOG", IupGetDialog(ih));
IupSetAttribute(filedlg, "TITLE", "Select Folder for Files");
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
strcpy(folder, IupGetAttribute(filedlg, "VALUE"));
IupDestroy(filedlg);
return folder;
}
IupDestroy(filedlg);
return NULL;
}
static void replaceDot(char* filename)
{
/* replace all "." by "_" */
/* replace all "-" by "_" */
while (*filename)
{
if (*filename == '.')
*filename = '_';
if (*filename == '-')
*filename = '_';
filename++;
}
}
static char* strdup_free(const char* str, char* str_ptr)
{
int len = (int)strlen(str);
char* tmp = malloc(len + 1);
memcpy(tmp, str, len + 1);
free(str_ptr);
return tmp;
}
static char* strGetFileTitle(const char* filename)
{
int i, last = 1, len = (int)strlen(filename);
char* file_title = malloc(len + 1);
char* dot, *ft_str = file_title;
memcpy(file_title, filename, len + 1);
dot = strchr(file_title, '.');
if (dot) *dot = 0;
for (i = len - 1; i >= 0; i--)
{
if (last && file_title[i] == '.')
{
/* cut last "." forward */
file_title[i] = 0;
last = 0;
}
if (file_title[i] == '\\' || file_title[i] == '/')
{
replaceDot(file_title + i + 1);
return strdup_free(file_title + i + 1, ft_str);
}
}
replaceDot(file_title);
return strdup_free(file_title, ft_str);
}
static Ihandle* vLedGetCurrentMultitext(Ihandle* ih)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
return (Ihandle*)IupGetAttribute(tabs, "VALUE_HANDLE");
}
static int LoadImageFile(Ihandle* ih_item, const char* img_filename)
{
Ihandle* currMultitext = vLedGetCurrentMultitext(ih_item);
Ihandle* new_image = IupLoadImage(img_filename);
if (new_image)
{
int lin, col, pos, i, n = 0;
char *buffer;
char* img_file_title = strGetFileTitle(img_filename);
char name[80];
for (i = 0; img_file_title[i] != 0; i++)
{
if (!vled_isprint(img_file_title[i]))
continue;
if (img_file_title[i] == ' ')
name[n] = '_';
else
name[n] = img_file_title[i];
n++;
}
name[n] = 0;
IupSetHandle(img_file_title, new_image);
iupImageExportToString(new_image, &buffer, "LED", name);
pos = IupGetInt(currMultitext, "CARETPOS");
IupTextConvertPosToLinCol(currMultitext, pos, &lin, &col);
IupTextConvertLinColToPos(currMultitext, lin, 0, &pos);
IupSetAttribute(currMultitext, "UNDOACTION", "BEGIN");
IupSetAttributeId(currMultitext, "INSERT", pos, buffer);
IupSetAttribute(currMultitext, "UNDOACTION", "END");
free(img_file_title);
free(buffer);
IupDestroy(new_image);
return 1;
}
else
{
char* err_msg = IupGetGlobal("IUPIM_LASTERROR");
if (err_msg)
IupMessageError(IupGetDialog(ih_item), err_msg);
return 0;
}
}
static int vLedIsAlien(Ihandle *elem, const char* filename)
{
char *elem_file;
if (!elem || !filename)
return 0;
elem_file = iupAttribGet(elem, "_IUPLED_FILENAME");
if (!elem_file || !iupStrEqual(elem_file, filename))
return 1;
return 0;
}
static char* vLedGetElementTreeTitle(Ihandle* ih)
{
char* title = iupAttribGetLocal(ih, "TITLE");
char* str = iupStrGetMemory(200);
char* name = vLedGetName(ih);
char* not_def = NULL;
if (IupClassMatch(ih, "user") && iupAttribGet(ih, "_IUPLED_NOTDEF_NAME"))
{
name = iupAttribGet(ih, "_IUPLED_NOTDEF_NAME");
not_def = " - not defined";
}
if (title)
{
char buffer[51];
if (iupStrLineCount(title, (int)strlen(title)) > 1)
{
int len;
iupStrNextLine(title, &len); /* get the size of the first line */
if (len > 50) len = 50;
iupStrCopyN(buffer, len + 1, title);
title = &buffer[0];
}
if (name)
sprintf(str, "[%s] \"%.50s\" (%.50s)%s", IupGetClassName(ih), title, name, not_def? not_def: "");
else
sprintf(str, "[%s] \"%.50s\"", IupGetClassName(ih), title);
}
else
{
if (name)
sprintf(str, "[%s] (%.50s)%s", IupGetClassName(ih), name, not_def ? not_def : "");
else
sprintf(str, "[%s]", IupGetClassName(ih));
}
if (ih->iclass->nativetype == IUP_TYPEIMAGE)
sprintf(str + strlen(str), " - %s", IupGetAttribute(ih, "RASTERSIZE"));
return str;
}
static void vLedTreeSetNodeInfo(Ihandle* elem_tree, int id, Ihandle* ih, int link)
{
IupSetAttributeId(elem_tree, "TITLE", id, vLedGetElementTreeTitle(ih));
IupTreeSetUserId(elem_tree, id, ih);
if (link)
{
IupSetAttributeId(elem_tree, "IMAGE", id, "IupVLedShortcut");
IupSetAttributeId(elem_tree, "LINK", id, "1");
}
}
static int vLedTreeAddNode(Ihandle* elem_tree, int id, Ihandle* ih, const char *filename, int add, int root)
{
int link = 0;
if (vLedIsAlien(ih, filename) || iupAttribGet(ih, "_IUPLED_NOTDEF_NAME") || (vLedGetName(ih) && !root))
link = 1;
if (ih->iclass->childtype != IUP_CHILDNONE && !iupAttribGet(ih, "_IUPLED_NOTDEF_NAME") && !link)
{
if (add)
IupSetAttributeId(elem_tree, "ADDBRANCH", id, "");
else
IupSetAttributeId(elem_tree, "INSERTBRANCH", id, "");
}
else
{
if (add)
IupSetAttributeId(elem_tree, "ADDLEAF", id, "");
else
IupSetAttributeId(elem_tree, "INSERTLEAF", id, "");
}
id = IupGetInt(elem_tree, "LASTADDNODE");
vLedTreeSetNodeInfo(elem_tree, id, ih, link);
return id;
}
static int vLedTreeAddChildren(Ihandle* elem_tree, int last_child_id, Ihandle* parent, const char *filename)
{
Ihandle *child;
int add = 1; /* add only for the first element */
for (child = parent->firstchild; child; child = child->brother)
{
if (!(child->flags & IUP_INTERNAL)) /* only non-internal */
{
last_child_id = vLedTreeAddNode(elem_tree, last_child_id, child, filename, add, 0); /* add element node or a link */
if (child->iclass->childtype != IUP_CHILDNONE && !vLedIsAlien(child, filename) && !vLedGetName(child)) /* add its children if not a link and not named */
vLedTreeAddChildren(elem_tree, last_child_id, child, filename);
add = 0; /* use insert */
}
}
return last_child_id;
}
static void enable_elem_tools_buttons(Ihandle *elem_tree, int active, Ihandle* elem)
{
/* elements tools buttons */
Ihandle *bt;
IupSetAttribute(IupGetBrother(IupGetParent(elem_tree)), "ACTIVE", active? "YES": "NO");
bt = IupGetDialogChild(elem_tree, "ELEM_LAYOUT_BUTTON");
if (elem && IupGetDialog(elem))
IupSetAttribute(bt, "ACTIVE", "Yes");
else
IupSetAttribute(bt, "ACTIVE", "No");
bt = IupGetDialogChild(elem_tree, "ELEM_IMAGE_BUTTON");
if (elem && elem->iclass->nativetype == IUP_TYPEIMAGE)
IupSetAttribute(bt, "ACTIVE", "Yes");
else
IupSetAttribute(bt, "ACTIVE", "No");
}
static void updateElemTree(Ihandle* elem_tree, const char* filename)
{
int last_child_id = -1;
int i, j, num_names = IupGetAllNames(NULL, -1);
char* *names = malloc(sizeof(char*)*num_names);
int num_named_handles = 0;
Ihandle* *named_handles;
IupGetAllNames(names, num_names);
IupSetAttribute(elem_tree, "DELNODE0", "ALL");
enable_elem_tools_buttons(elem_tree, 0, NULL);
for (i = 0; i < num_names; i++)
{
Ihandle* elem = IupGetHandle(names[i]);
if (iupObjectCheck(elem))
{
if (vLedIsAlien(elem, filename) || iupStrEqualPartial(names[i], "_IUP_NAME"))
names[i] = NULL;
else
num_named_handles++;
}
else
names[i] = NULL;
}
if (num_named_handles == 0)
return;
named_handles = malloc(sizeof(Ihandle*)*num_named_handles);
j = 0;
for (i = 0; i < num_names; i++)
{
if (names[i])
{
Ihandle* elem = IupGetHandle(names[i]);
named_handles[j] = elem;
j++;
}
}
qsort(named_handles, num_named_handles, sizeof(Ihandle*), compare_named_handles);
for (i = 0; i < num_named_handles; i++)
{
Ihandle* elem = named_handles[i];
last_child_id = vLedTreeAddNode(elem_tree, last_child_id, elem, filename, 0, 1); /* here use insert always */
if (elem->iclass->childtype != IUP_CHILDNONE)
vLedTreeAddChildren(elem_tree, last_child_id, elem, filename);
}
// IupSetAttribute(elem_tree, "VALUE", "1");
IupSetAttribute(elem_tree, "VALUE", "0");
enable_elem_tools_buttons(elem_tree, 1, (Ihandle*)IupTreeGetUserId(elem_tree, 0));
free(names);
}
static char* load_comments(const char* filename)
{
if (filename)
{
IlineFile* line_file = iupLineFileOpen(filename);
if (line_file)
{
Iarray* str_array = iupArrayCreate(1024, sizeof(char)); /* just set an initial size, but count is 0 */
char* comments;
int count, has_comment = 0;
do
{
const char* line_buffer;
int i = 0;
int line_len = iupLineFileReadLine(line_file);
if (line_len == -1)
break;
line_buffer = iupLineFileGetBuffer(line_file);
while (line_buffer[i] == ' ' || line_buffer[i] == '\t') /* skip spaces and tabs */
i++;
if (line_buffer[i] == '#')
has_comment = 1;
else if (line_buffer[i] != 0)
break;
count = iupArrayCount(str_array);
comments = iupArrayAdd(str_array, line_len + 1);
if (line_len)
memcpy(comments + count, line_buffer, line_len);
comments[count + line_len] = '\n';
} while (!iupLineFileEOF(line_file));
count = iupArrayCount(str_array);
if (has_comment && count != 0)
{
comments = iupArrayReleaseData(str_array);
comments[count] = 0; /* replace the least '\n' by terminator */
}
else
comments = NULL;
iupArrayDestroy(str_array);
iupLineFileClose(line_file);
return comments;
}
}
return NULL;
}
static int unload_led(Ihandle* multitext, const char *filename);
static int load_led(Ihandle *elem_tree, const char *filename, int use_buffer)
{
Ihandle* multitext = vLedGetCurrentMultitext(elem_tree);
const char* error;
IupSetInt(multitext, "MARKERDELETEALL", 1);
if (use_buffer)
{
char* buffer = IupGetAttribute(multitext, "VALUE");
error = iupLoadLed(filename, buffer, 1); /* save info */
}
else
error = iupLoadLed(filename, NULL, 1); /* save info */
if (error)
{
int line;
const char* error_mark = "bad input at line";
const char* error_line = strstr(error, error_mark);
error_line += strlen(error_mark) + 1;
sscanf(error_line, "%d", &line); /* line in LED error starts at 1 */
IupSetIntId(multitext, "MARKERADD", line-1, 1);
IupSetStrf(multitext, "CARET", "%d,0", line-1);
IupMessageError(IupGetDialog(elem_tree), error);
}
if (error)
{
unload_led(multitext, filename);
IupSetAttribute(multitext, "LOADED", NULL);
}
else
{
char* comments = load_comments(filename);
if (comments)
{
iupAttribSetStr(multitext, "_IUPLED_COMMENTS", comments);
free(comments);
}
IupSetAttribute(multitext, "LOADED", "1");
updateElemTree(elem_tree, filename);
}
return IUP_DEFAULT;
}
static void unloadNamedElements(Ihandle *elem)
{
Ihandle *child;
for (child = elem->firstchild; child; child = child->brother)
{
if (child->iclass->childtype != IUP_CHILDNONE)
unloadNamedElements(child);
if (vLedGetName(child))
IupDetach(child);
}
}
static void check_layout_prop_dialogs(Ihandle* ih)
{
int i, count = iupDlgListCount();
Ihandle* dlg;
Ihandle* elem_tree_box = IupGetDialogChild(ih, "ELEM_TREE_BOX");
dlg = (Ihandle*)IupGetAttribute(elem_tree_box, "PROPERTIES_DIALOG");
if (iupObjectCheck(dlg)) /* properties dialog exists */
{
Ihandle* elem = (Ihandle*)iupAttribGet(dlg, "_IUP_PROPELEMENT");
if (!iupObjectCheck(elem)) /* if elem is not valid anymore then hide the properties dialog */
IupHide(dlg);
}
for (dlg = iupDlgListFirst(), i = 0; dlg && i < count; i++)
{
Ihandle* next_dlg = iupDlgListNext();
if (iupAttribGet(dlg, "_IUP_LAYOUTDIALOG")) /* is a IupLayoutDialog */
{
Ihandle* dlg_elem = (Ihandle*)iupAttribGet(dlg, "_IUP_LAYOUTDIALOG_DIALOG");
if (!iupObjectCheck(dlg_elem)) /* if dlg_elem is not valid anymore then destroy the layout dialog */
IupDestroy(dlg);
}
dlg = next_dlg;
}
}
static int unload_led(Ihandle* multitext, const char *filename)
{
int i, num_named_elems = 0, num_names = IupGetAllNames(NULL, -1);
char* *names = malloc(sizeof(char*)*num_names);
Ihandle* *named_elems = malloc(sizeof(Ihandle*)*num_names);
IupGetAllNames(names, num_names);
for (i = 0; i < num_names; i++)
{
if (!iupStrEqualPartial(names[i], "_IUP_NAME"))
{
named_elems[num_named_elems] = IupGetHandle(names[i]);
num_named_elems++;
}
}
for (i = 0; i < num_named_elems; i++)
{
Ihandle *elem = named_elems[i],
*parent, *brother = NULL;
char old_name[100] = "";
int save_not_defined = 0;
if (!iupObjectCheck(elem)) /* it may already being destroyed in the hierarchy */
{
named_elems[i] = NULL;
continue;
}
if (vLedIsAlien(elem, filename))
{
named_elems[i] = NULL;
continue;
}
if (IupClassMatch(elem, "menu"))
{
parent = elem->parent;
if (parent && IupClassMatch(parent, "dialog"))
IupSetAttribute(parent, "MENU", NULL);
}
if (IupClassMatch(elem, "dialog"))
{
Ihandle *menu = (Ihandle *) IupGetAttribute(elem, "MENU");
if (menu)
IupSetAttribute(elem, "MENU", NULL);
}
if (elem->iclass->childtype != IUP_CHILDNONE)
unloadNamedElements(elem);
parent = elem->parent;
brother = NULL;
if (parent && vLedIsAlien(parent, filename))
{
strcpy(old_name, vLedGetName(elem));
brother = elem->brother;
save_not_defined = 1;
}
IupDetach(elem);
if (save_not_defined)
{
Ihandle *user = IupUser();
iupAttribSetStr(user, "_IUPLED_NOTDEF_NAME", old_name);
IupInsert(parent, brother, user);
}
}
for (i = 0; i < num_named_elems; i++)
{
Ihandle *elem = named_elems[i];
if (iupObjectCheck(elem))
IupDestroy(elem);
}
check_layout_prop_dialogs(multitext);
free(names);
free(named_elems);
return IUP_DEFAULT;
}
static int item_iup_action_cb(void)
{
IupHelp("http://www.tecgraf.puc-rio.br/iup");
return IUP_DEFAULT;
}
static int item_help_action_cb(void)
{
IupHelp("http://www.tecgraf.puc-rio.br/iup/index.html?url=iupvisualled.html");
return IUP_DEFAULT;
}
static int item_about_action_cb(void)
{
IupVersionShow();
return IUP_DEFAULT;
}
static const char *getLastNonAlphaNumeric(const char *text)
{
int len = (int)strlen(text);
const char *c = text + len - 1;
if (*c == '\n')
c--;
for (; c != text; c--)
{
if (*c < 48 || (*c > 57 && *c < 65) || (*c > 90 && *c < 97) || *c > 122)
return c + 1;
}
return NULL;
}
static char *filterList(const char *text, const char *list)
{
char *filteredList[1024]; /* maximum number of items */
char *retList;
int count = 0, text_len = (int)strlen(text);
int i, len;
const char *lastValue = list;
const char *nextValue = iupStrNextValue(list, (int)strlen(list), &len, ' ');
while (len != 0)
{
if (text_len <= len && iupStrEqualPartial(lastValue, text))
{
char *value = malloc(80);
strncpy(value, lastValue, len);
value[len] = 0;
filteredList[count++] = value;
}
lastValue = nextValue;
nextValue = iupStrNextValue(nextValue, (int)strlen(nextValue), &len, ' ');
}
retList = malloc(10240);
retList[0] = 0;
for (i = 0; i < count; i++)
{
if (i == 0)
{
strcpy(retList, filteredList[i]);
strcat(retList, " ");
}
else
{
strcat(retList, filteredList[i]);
strcat(retList, " ");
}
}
for (i = 0; i < count; i++)
free(filteredList[i]);
return retList;
}
static int multitext_valuechanged_cb(Ihandle* multitext)
{
if (IupGetInt(multitext, "AUTOCOMPLETION"))
{
const char *t;
char *text = IupGetAttribute(multitext, "LINEVALUE");
int col = IupGetInt2(multitext, "CARET");
text[col + 1] = '\0';
t = getLastNonAlphaNumeric(text);
if (t != NULL && *t != '\n' && *t != 0)
{
Ihandle* ih = IupGetDialog(multitext);
char* keywords = IupGetAttribute(ih, "LED_KEYWORDS");
char *fList = filterList(t, keywords);
if (strlen(fList) > 0)
IupSetAttributeId(multitext, "AUTOCSHOW", (int)strlen(t) - 1, fList);
free(fList);
}
return IUP_DEFAULT;
}
IupSetAttribute(multitext, "LOADED", NULL);
return IUP_CONTINUE;
}
static int multitext_kesc_cb(Ihandle *multitext)
{
if (!IupGetInt(multitext, "AUTOCOMPLETION"))
return IUP_CONTINUE;
if (IupGetInt(multitext, "AUTOCACTIVE"))
IupSetAttribute(multitext, "AUTOCCANCEL", "YES");
return IUP_CONTINUE;
}
static void set_keywords(Ihandle* multitext)
{
Ihandle* ih = IupGetDialog(multitext);
char* value = IupGetAttribute(ih, "LED_KEYWORDS");
if (!value)
{
char keywords[2048] = "";
char *p_keyw;
int i, num_classes;
char **list;
num_classes = IupGetAllClasses(NULL, -1);
list = (char **)malloc(num_classes * sizeof(char *));
IupGetAllClasses(list, num_classes);
p_keyw = &keywords[0];
for (i = 0; i < num_classes; i++)
p_keyw += sprintf(p_keyw, "%s ", list[i]);
iupStrUpper(keywords, keywords);
IupSetStrAttribute(ih, "LED_KEYWORDS", keywords);
value = IupGetAttribute(ih, "LED_KEYWORDS");
free(list);
}
IupSetStrAttribute(multitext, "KEYWORDS0", value);
}
static int multitext_map_cb(Ihandle* multitext)
{
Ihandle* config = get_config(multitext);
const char *value;
IupSetAttribute(multitext, "LEXERLANGUAGE", "led");
set_keywords(multitext);
IupSetAttribute(multitext, "STYLEFGCOLOR1", "0 128 0"); /* 1-Led comment<6E>*/
IupSetAttribute(multitext, "STYLEFGCOLOR2", "255 128 0"); /* 2-Number<65><72>*/
IupSetAttribute(multitext, "STYLEFGCOLOR3", "0 0 255"); /* 3-Keyword<72><64>*/
IupSetAttribute(multitext, "STYLEFGCOLOR4", "164 0 164"); /* 4-String<6E><67>*/
IupSetAttribute(multitext, "STYLEFGCOLOR5", "164 0 164"); /* 5-Character<65><72>*/
IupSetAttribute(multitext, "STYLEFGCOLOR6", "164 0 0"); /* 6-Operator<6F><72>*/
/* 3, 8 and 9 - are not used */
IupSetAttribute(multitext, "STYLEBOLD10", "YES");
IupSetAttribute(multitext, "MARKERHIGHLIGHT", "YES");
IupSetAttributeId(multitext, "MARKERBGCOLOR", 25, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDEREND */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 25, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDEREND */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 26, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDEROPENMID */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 26, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDEROPENMID */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 27, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDERMIDTAIL */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 27, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDERMIDTAIL */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 28, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDERTAIL */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 28, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDERTAIL */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 29, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDERSUB */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 29, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDERSUB */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 30, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDER */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 30, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDER */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 31, "0 0 0"); /* BGCOLOR para SC_MARKNUM_FOLDEROPEN */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 31, "255 255 255"); /* FGCOLOR para SC_MARKNUM_FOLDEROPEN */
IupSetAttribute(multitext, "PROPERTY", "fold=1");
IupSetAttribute(multitext, "PROPERTY", "fold.compact=0"); /* avoid folding of blank lines */
IupSetAttribute(multitext, "_IUP_FOLDDING", "1");
/* Folding margin=3 */
IupSetAttribute(multitext, "MARGINWIDTH3", VLED_FOLDING_MARGIN);
IupSetAttribute(multitext, "MARGINMASKFOLDERS3", "Yes");
IupSetAttribute(multitext, "MARGINSENSITIVE3", "YES");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDER=BOXPLUS");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDEROPEN=BOXMINUS");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDEREND=BOXPLUSCONNECTED");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDERMIDTAIL=TCORNER");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDEROPENMID=BOXMINUSCONNECTED");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDERSUB=VLINE");
IupSetAttribute(multitext, "MARKERDEFINE", "FOLDERTAIL=LCORNER");
IupSetAttribute(multitext, "FOLDFLAGS", "LINEAFTER_CONTRACTED");
value = IupConfigGetVariableStr(config, "IupVisualLED", "CommentColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR1", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "CommentColor", IupGetAttribute(multitext, "STYLEFGCOLOR1"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "NumberColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR2", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "NumberColor", IupGetAttribute(multitext, "STYLEFGCOLOR4"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "KeywordColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR3", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "KeywordColor", IupGetAttribute(multitext, "STYLEFGCOLOR5"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "StringColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR4", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "StringColor", IupGetAttribute(multitext, "STYLEFGCOLOR6"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "CharacterColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR5", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "CharacterColor", IupGetAttribute(multitext, "STYLEFGCOLOR7"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "OperatorColor");
if (value)
IupSetStrAttribute(multitext, "STYLEFGCOLOR6", value);
else
IupConfigSetVariableStr(config, "IupVisualLED", "OperatorColor", IupGetAttribute(multitext, "STYLEFGCOLOR10"));
value = IupConfigGetVariableStr(config, "IupVisualLED", "AutoCompletion");
if (value)
IupSetStrAttribute(multitext, "AUTOCOMPLETION", value);
value = IupConfigGetVariableStr(config, "IupVisualLED", "Folding");
if (iupStrBoolean(value))
{
IupSetAttribute(multitext, "MARGINWIDTH3", VLED_FOLDING_MARGIN);
IupSetAttribute(multitext, "PROPERTY", "fold=1");
IupSetAttribute(multitext, "_IUP_FOLDDING", "1");
IupSetAttribute(multitext, "FOLDALL", "EXPAND");
}
else
{
IupSetAttribute(multitext, "MARGINWIDTH3", "0");
IupSetAttribute(multitext, "PROPERTY", "fold=0");
IupSetAttribute(multitext, "_IUP_FOLDDING", NULL);
}
return IUP_DEFAULT;
}
static Ihandle* vLedGetElemTree(Ihandle* multitext)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(multitext, "ELEM_TREE");
return elem_tree;
}
static int tabChange_cb(Ihandle* tabs, Ihandle* new_multitext, Ihandle* old_multitext)
{
Ihandle* elem_tree_box = IupGetDialogChild(tabs, "ELEM_TREE_BOX");
Ihandle* elem_tree = vLedGetElemTree(new_multitext);
int tree_count = IupGetInt(elem_tree, "COUNT");
IFnnn oldTabChange_cb = (IFnnn)IupGetCallback(tabs, "OLDTABCHANGE_CB");
if (oldTabChange_cb)
oldTabChange_cb(tabs, new_multitext, old_multitext);
IupSetAttribute(elem_tree_box, "VALUE_HANDLE", (char*)elem_tree);
enable_elem_tools_buttons(elem_tree, tree_count > 0, tree_count > 0? (Ihandle*)IupTreeGetUserId(elem_tree, IupGetInt(elem_tree, "VALUE")) : NULL);
return IUP_DEFAULT;
}
static void reload_led_file(Ihandle* multitext)
{
Ihandle* elem_tree = vLedGetElemTree(multitext);
Ihandle* config = get_config(multitext);
char* filename = IupGetAttribute(multitext, "FILENAME"); /* never NULL here */
unload_led(multitext, filename);
IupSetAttribute(multitext, "LOADED", NULL);
if (IupConfigGetVariableIntDef(config, "IupVisualLED", "AutoLoad", 1))
load_led(elem_tree, filename, 0);
else
{
IupSetAttribute(elem_tree, "DELNODE0", "ALL");
enable_elem_tools_buttons(elem_tree, 0, NULL);
}
}
static int scidlg_newfilename_cb(Ihandle* main_dialog, char* old_filename, char* new_filename)
{
int i, num_names = IupGetAllNames(NULL, -1);
char* *names = malloc(sizeof(char*)*num_names);
IupGetAllNames(names, num_names);
for (i = 0; i < num_names; i++)
{
Ihandle* elem = IupGetHandle(names[i]);
if (iupObjectCheck(elem))
{
if (!vLedIsAlien(elem, old_filename) && !iupStrEqualPartial(names[i], "_IUP_NAME"))
iupAttribSetStr(elem, "_IUPLED_FILENAME", new_filename);
}
}
free(names);
(void)main_dialog;
return IUP_DEFAULT;
}
static int scidlg_loadfile_cb(Ihandle* main_dialog, Ihandle* multitext)
{
/* called after the file is loaded */
reload_led_file(multitext);
(void)main_dialog;
return IUP_DEFAULT;
}
static int scidlg_savefile_cb(Ihandle* main_dialog, Ihandle* multitext)
{
/* called after the file is saved */
reload_led_file(multitext);
(void)main_dialog;
return IUP_DEFAULT;
}
static char* changeTabsForSpaces(const char *text, int tabsize)
{
char *newText;
int len = (int)strlen(text);
int i, j, new_i = 0, tabs = 0;
for (i = 0; i < len; i++)
{
if (text[i] == '\t')
tabs++;
}
if (tabs == 0)
return iupStrDup(text);
newText = malloc(len + tabs * tabsize);
for (i = 0; i < len; i++)
{
char c = text[i];
if (c == '\t')
{
int nWhites = tabsize - (new_i % tabsize);
for (j = 0; j < nWhites; j++)
{
newText[new_i] = ' ';
new_i++;
}
continue;
}
newText[new_i] = c;
new_i++;
}
newText[new_i] = '\0';
return newText;
}
static Iclass* find_class_at_pos(Ihandle* multitext, int pos)
{
int start, end, lin, start_col, end_col;
int tabSize = IupGetInt(multitext, "TABSIZE");
char *text;
Iclass* ic;
char* word;
char* wordpos = IupGetAttributeId(multitext, "WORDPOS", pos);
if (wordpos == NULL)
return NULL;
sscanf(wordpos, "%d:%d", &start, &end);
IupTextConvertPosToLinCol(multitext, start, &lin, &start_col);
IupTextConvertPosToLinCol(multitext, end, &lin, &end_col);
text = IupGetAttributeId(multitext, "LINE", lin);
text = changeTabsForSpaces(text, tabSize); /* this allocates a new string that can be changed */
text[end_col] = '\0';
word = text + start_col;
iupStrLower(word, word);
ic = iupRegisterFindClass(word);
free(text);
return ic;
}
static int multitext_dwell_cb(Ihandle* multitext, int code, int pos, int x, int y)
{
if (code)
{
Iclass* ic = find_class_at_pos(multitext, pos);
if (ic)
{
iupClassInfoGetDesc(ic, multitext, "TIP");
IupSetAttribute(multitext, "TIPVISIBLE", "Yes");
}
}
else
{
IupSetAttribute(multitext, "TIPVISIBLE", "No");
IupSetAttribute(multitext, "TIP", NULL);
}
(void)x;
(void)y;
return IUP_DEFAULT;
}
static int multitext_kf1_cb(Ihandle *multitext)
{
int pos = IupGetInt(multitext, "CARETPOS");
Iclass* ic = find_class_at_pos(multitext, pos);
if (ic)
iupClassInfoShowHelp(ic->name);
return IUP_CONTINUE;
}
static int tree_selection_cb(Ihandle* elem_tree, int id, int status);
static int tree_executeleaf_cb(Ihandle* elem_tree, int id);
static int tree_rightclick_cb(Ihandle* elem_tree, int id);
static int scidlg_newtext_cb(Ihandle* main_dialog, Ihandle *multitext)
{
/* this is called before the multitext is mapped */
Ihandle* elem_tree, *elem_tree_box;
IupSetCallback(multitext, "VALUECHANGED_CB", (Icallback)multitext_valuechanged_cb);
IupSetCallback(multitext, "K_ESC", (Icallback)multitext_kesc_cb);
IupSetCallback(multitext, "K_F1", (Icallback)multitext_kf1_cb);
IupSetCallback(multitext, "MAP_CB", (Icallback)multitext_map_cb);
IupSetCallback(multitext, "DWELL_CB", (Icallback)multitext_dwell_cb);
IupSetAttribute(multitext, "AUTOCOMPLETION", "OFF");
IupSetAttribute(multitext, "MOUSEDWELLTIME", "1000");
IupSetAttribute(multitext, "MARGINWIDTH2", "0");
IupSetAttribute(multitext, "MARGINTYPE2", "SYMBOL");
IupSetAttribute(multitext, "MARGINSENSITIVE2", "YES");
IupSetAttribute(multitext, "MARGINMASKFOLDERS2", "NO"); /* (disable folding) */
IupSetAttributeId(multitext, "MARGINMASK", 2, "10"); /* 1110 - marker=1 and marker=2 ad marker=3 */
IupSetAttributeId(multitext, "MARKERBGCOLOR", 1, "0 255 0");
IupSetAttributeId(multitext, "MARKERALPHA", 1, "80");
IupSetAttributeId(multitext, "MARKERSYMBOL", 1, "BACKGROUND");
#ifdef WIN32
IupSetAttribute(multitext, "FONT", "Consolas, 11");
#else
IupSetAttribute(multitext, "FONT", "Monospace, 12");
/* Other alternatives for "Consolas" in Linux: "DejaVu Sans Mono", "Liberation Mono", "Nimbus Mono L", "FreeMono" */
#endif
elem_tree = IupTree();
IupSetAttribute(elem_tree, "EXPAND", "YES");
IupSetAttribute(elem_tree, "ADDROOT", "NO");
IupSetAttribute(elem_tree, "ADDEXPANDED", "NO"); /* very important for large LEDs (loads much faster) */
IupSetCallback(elem_tree, "SELECTION_CB", (Icallback)tree_selection_cb);
IupSetCallback(elem_tree, "EXECUTELEAF_CB", (Icallback)tree_executeleaf_cb);
IupSetCallback(elem_tree, "EXECUTEBRANCH_CB", (Icallback)tree_executeleaf_cb);
IupSetCallback(elem_tree, "RIGHTCLICK_CB", (Icallback)tree_rightclick_cb);
IupSetAttribute(elem_tree, "VISIBLELINES", "3");
IupSetAttribute(elem_tree, "IMAGELEAF", "IMGEMPTY");
IupSetAttribute(multitext, "ELEM_TREE", (char*)elem_tree);
elem_tree_box = IupGetDialogChild(main_dialog, "ELEM_TREE_BOX");
IupAppend(elem_tree_box, elem_tree);
IupMap(elem_tree);
IupSetAttribute(elem_tree_box, "VALUE_HANDLE", (char*)elem_tree);
IupRefreshChildren(elem_tree_box);
enable_elem_tools_buttons(elem_tree, 0, NULL);
return IUP_DEFAULT;
}
static char* get_filename(Ihandle *multitext)
{
/* if not saved yet return the displayed file title */
char *filename = IupGetAttribute(multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(multitext, "NEW_FILENAME");
return filename;
}
static int scidlg_closetext_cb(Ihandle* main_dialog, Ihandle *multitext)
{
Ihandle* elem_tree = vLedGetElemTree(multitext);
char *filename = get_filename(multitext);
unload_led(multitext, filename);
IupDestroy(elem_tree);
(void)main_dialog;
return IUP_DEFAULT;
}
static int scidlg_configsave_cb(Ihandle *main_dialog, Ihandle* config)
{
Ihandle* elem_tree_box = IupGetDialogChild(main_dialog, "ELEM_TREE_BOX");
Ihandle* extra_dlg = (Ihandle*)IupGetAttribute(elem_tree_box, "FIND_ELEM_DIALOG");
if (iupObjectCheck(extra_dlg))
{
IupConfigSetVariableStr(config, "FindElementDialog", "FindText", IupGetAttribute(IupGetDialogChild(extra_dlg, "FIND_TEXT"), "VALUE"));
IupConfigSetVariableStr(config, "FindElementDialog", "Target", IupGetAttribute((Ihandle*)IupGetAttribute(IupGetDialogChild(extra_dlg, "TARGET"), "VALUE_HANDLE"), "NAME"));
IupConfigDialogClosed(config, extra_dlg, "FindElementDialog");
}
extra_dlg = (Ihandle*)IupGetAttribute(elem_tree_box, "PROPERTIES_DIALOG");
if (iupObjectCheck(extra_dlg))
IupConfigDialogClosed(config, extra_dlg, "ElementPropertiesDialog");
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "IMAGE_EDITOR_DIALOG");
if (iupObjectCheck(extra_dlg))
IupConfigDialogClosed(config, extra_dlg, "ImageEditorDialog");
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "GLOBALS_DIALOG");
if (iupObjectCheck(extra_dlg))
IupConfigDialogClosed(config, extra_dlg, "GlobalsDialog");
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "CLASSINFO_DIALOG");
if (iupObjectCheck(extra_dlg))
IupConfigDialogClosed(config, extra_dlg, "ClassInfoDialog");
return IUP_DEFAULT;
}
static int scidlg_configload_cb(Ihandle *main_dialog, Ihandle* config)
{
const char* value;
value = IupConfigGetVariableStr(config, "IupVisualLED", "AutoCompletion");
if (value)
{
Ihandle* ih_item = IupGetDialogChild(main_dialog, "ITM_AUTOCOMPLETE");
IupSetStrAttribute(ih_item, "VALUE", value);
}
value = IupConfigGetVariableStr(config, "IupVisualLED", "Folding");
if (value)
{
Ihandle* ih_item = IupGetDialogChild(main_dialog, "ITM_FOLDING");
IupSetStrAttribute(ih_item, "VALUE", value);
}
return IUP_DEFAULT;
}
static int scidlg_markerchanged_cb(Ihandle *main_dialog, Ihandle *multitext, int lin, int margin)
{
if (margin == 3)
IupSetfAttribute(multitext, "FOLDTOGGLE", "%d", lin);
(void)main_dialog;
return IUP_DEFAULT;
}
static int led_menu_open_cb(Ihandle *ih_menu)
{
Ihandle* menu_foldall = IupGetDialogChild(ih_menu, "ITM_FOLD_ALL");
Ihandle* item_toggle_folding = IupGetDialogChild(ih_menu, "ITM_TOGGLE_FOLDING");
Ihandle* item_folding = IupGetDialogChild(ih_menu, "ITM_FOLDING");
Ihandle* item_rewrite = IupGetDialogChild(ih_menu, "ITM_REWRITE");
Ihandle* multitext = vLedGetCurrentMultitext(ih_menu);
int loaded = IupGetInt(multitext, "LOADED");
if (IupGetInt(item_folding, "VALUE"))
{
IupSetAttribute(item_toggle_folding, "ACTIVE", "Yes");
IupSetAttribute(menu_foldall, "ACTIVE", "Yes");
}
else
{
IupSetAttribute(item_toggle_folding, "ACTIVE", "NO");
IupSetAttribute(menu_foldall, "ACTIVE", "NO");
}
if (loaded)
IupSetAttribute(item_rewrite, "ACTIVE", "Yes");
else
IupSetAttribute(item_rewrite, "ACTIVE", "NO");
return IUP_DEFAULT;
}
static int tools_menu_open_cb(Ihandle *ih_menu)
{
Ihandle* item_export_img = IupGetDialogChild(ih_menu, "ITM_EXP_IMG");
Ihandle* item_show_all_img = IupGetDialogChild(ih_menu, "ITM_SHOW_ALL_IMG");
Ihandle* item_export_led = IupGetDialogChild(ih_menu, "ITM_EXP_LED");
Ihandle* item_export_open_led = IupGetDialogChild(ih_menu, "ITM_EXPORT_OPEN_LED");
Ihandle* item_export_proj_led = IupGetDialogChild(ih_menu, "ITM_EXP_PROJ_LED");
Ihandle* item_export_lua = IupGetDialogChild(ih_menu, "ITM_EXP_LUA");
Ihandle* item_export_open_lua = IupGetDialogChild(ih_menu, "ITM_EXPORT_OPEN_LUA");
Ihandle* item_export_proj_lua = IupGetDialogChild(ih_menu, "ITM_EXP_PROJ_LUA");
Ihandle* item_export_c = IupGetDialogChild(ih_menu, "ITM_EXP_C");
Ihandle* item_export_open_c = IupGetDialogChild(ih_menu, "ITM_EXPORT_OPEN_C");
Ihandle* item_export_proj_c = IupGetDialogChild(ih_menu, "ITM_EXP_PROJ_C");
Ihandle *projConfig = (Ihandle*)iupAttribGetInherit(ih_menu, "_IUP_PROJECT_CONFIG");
Ihandle* multitext = vLedGetCurrentMultitext(ih_menu);
int loaded = IupGetInt(multitext, "LOADED");
/* all these tools are based on the elements that are loaded */
if (loaded)
{
IupSetAttribute(item_show_all_img, "ACTIVE", "YES");
IupSetAttribute(item_export_img, "ACTIVE", "YES");
IupSetAttribute(item_export_led, "ACTIVE", "YES");
IupSetAttribute(item_export_open_led, "ACTIVE", "YES");
IupSetAttribute(item_export_lua, "ACTIVE", "YES");
IupSetAttribute(item_export_open_lua, "ACTIVE", "YES");
IupSetAttribute(item_export_c, "ACTIVE", "YES");
IupSetAttribute(item_export_open_c, "ACTIVE", "YES");
}
else
{
IupSetAttribute(item_show_all_img, "ACTIVE", "NO");
IupSetAttribute(item_export_img, "ACTIVE", "NO");
IupSetAttribute(item_export_led, "ACTIVE", "NO");
IupSetAttribute(item_export_open_led, "ACTIVE", "NO");
IupSetAttribute(item_export_lua, "ACTIVE", "NO");
IupSetAttribute(item_export_open_lua, "ACTIVE", "NO");
IupSetAttribute(item_export_c, "ACTIVE", "NO");
IupSetAttribute(item_export_open_c, "ACTIVE", "NO");
}
if (projConfig && loaded)
{
IupSetAttribute(item_export_proj_c, "ACTIVE", "YES");
IupSetAttribute(item_export_proj_lua, "ACTIVE", "YES");
IupSetAttribute(item_export_proj_led, "ACTIVE", "YES");
}
else
{
IupSetAttribute(item_export_proj_c, "ACTIVE", "NO");
IupSetAttribute(item_export_proj_lua, "ACTIVE", "NO");
IupSetAttribute(item_export_proj_led, "ACTIVE", "NO");
}
return IUP_DEFAULT;
}
static int item_autocomplete_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
int children_count = IupGetChildCount(tabs);
Ihandle* multitext;
Ihandle* config = get_config(ih_item);
int i;
if (IupGetInt(ih_item, "VALUE"))
{
IupSetAttribute(ih_item, "VALUE", "OFF");
for (i = 0; i < children_count; i++)
{
multitext = IupGetChild(tabs, i);
IupSetAttribute(multitext, "AUTOCOMPLETION", "OFF");
}
}
else
{
IupSetAttribute(ih_item, "VALUE", "ON");
for (i = 0; i < children_count; i++)
{
multitext = IupGetChild(tabs, i);
IupSetAttribute(multitext, "AUTOCOMPLETION", "ON");
}
}
IupConfigSetVariableStr(config, "IupVisualLED", "AutoCompletion", IupGetAttribute(ih_item, "VALUE"));
return IUP_DEFAULT;
}
static int setparent_param_cb(Ihandle* param_dialog, int param_index, void* user_data)
{
if (param_index == IUP_GETPARAM_MAP)
{
Ihandle* ih = (Ihandle*)user_data;
IupSetAttributeHandle(param_dialog, "PARENTDIALOG", ih);
}
return 1;
}
static int item_style_config_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
int children_count = IupGetChildCount(tabs);
Ihandle* multitext;
Ihandle* config = get_config(ih_item);
char commentColor[30], numberColor[30], keywordColor[30],
stringColor[30], characterColor[30], operatorColor[30];
int i;
strcpy(commentColor, IupConfigGetVariableStr(config, "IupVisualLED", "CommentColor"));
strcpy(numberColor, IupConfigGetVariableStr(config, "IupVisualLED", "NumberColor"));
strcpy(keywordColor, IupConfigGetVariableStr(config, "IupVisualLED", "KeywordColor"));
strcpy(stringColor, IupConfigGetVariableStr(config, "IupVisualLED", "StringColor"));
strcpy(characterColor, IupConfigGetVariableStr(config, "IupVisualLED", "CharacterColor"));
strcpy(operatorColor, IupConfigGetVariableStr(config, "IupVisualLED", "OperatorColor"));
if (!IupGetParam("Syntax Colors", setparent_param_cb, IupGetDialog(ih_item),
"Comment: %c\n"
"Number: %c\n"
"Keyword: %c\n"
"String: %c\n"
"Character: %c\n"
"Operator: %c\n",
commentColor, numberColor, keywordColor, stringColor, characterColor, operatorColor, NULL))
return IUP_DEFAULT;
IupConfigSetVariableStr(config, "IupVisualLED", "CommentColor", commentColor);
IupConfigSetVariableStr(config, "IupVisualLED", "NumberColor", numberColor);
IupConfigSetVariableStr(config, "IupVisualLED", "KeywordColor", keywordColor);
IupConfigSetVariableStr(config, "IupVisualLED", "StringColor", stringColor);
IupConfigSetVariableStr(config, "IupVisualLED", "CharacterColor", characterColor);
IupConfigSetVariableStr(config, "IupVisualLED", "OperatorColor", operatorColor);
for (i = 0; i < children_count; i++)
{
multitext = IupGetChild(tabs, i);
IupSetStrAttribute(multitext, "STYLEFGCOLOR1", commentColor);
IupSetStrAttribute(multitext, "STYLEFGCOLOR2", numberColor);
IupSetStrAttribute(multitext, "STYLEFGCOLOR3", keywordColor);
IupSetStrAttribute(multitext, "STYLEFGCOLOR4", stringColor);
IupSetStrAttribute(multitext, "STYLEFGCOLOR5", characterColor);
IupSetStrAttribute(multitext, "STYLEFGCOLOR6", operatorColor);
}
return IUP_DEFAULT;
}
static int item_folding_action_cb(Ihandle* ih)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
int children_count = IupGetChildCount(tabs);
Ihandle* multitext;
Ihandle* config = get_config(ih);
int i;
if (IupGetInt(ih, "VALUE"))
{
IupSetAttribute(ih, "VALUE", "OFF");
for (i = 0; i < children_count; i++)
{
multitext = IupGetChild(tabs, i);
IupSetAttribute(multitext, "PROPERTY", "fold=0");
IupSetAttribute(multitext, "MARGINWIDTH3", "0");
IupSetAttribute(multitext, "_IUP_FOLDDING", NULL);
}
}
else
{
IupSetAttribute(ih, "VALUE", "ON");
for (i = 0; i < children_count; i++)
{
multitext = IupGetChild(tabs, i);
IupSetAttribute(multitext, "PROPERTY", "fold=1");
IupSetAttribute(multitext, "MARGINWIDTH3", VLED_FOLDING_MARGIN);
IupSetAttribute(multitext, "_IUP_FOLDDING", "1");
IupSetAttribute(multitext, "FOLDALL", "EXPAND");
}
}
IupConfigSetVariableStr(config, "IupVisualLED", "Folding", IupGetAttribute(ih, "VALUE"));
return IUP_DEFAULT;
}
static int item_toggle_folding_action_cb(Ihandle* ih)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih);
int pos = IupGetInt(multitext, "CARETPOS");
int lin, col;
/* must test again because it can be called by the hot key */
if (!IupGetInt(multitext, "_IUP_FOLDDING"))
return IUP_DEFAULT;
IupTextConvertPosToLinCol(multitext, pos, &lin, &col);
if (!IupGetIntId(multitext, "FOLDLEVELHEADER", lin))
{
lin = IupGetIntId(multitext, "FOLDPARENT", lin);
if (lin < 0)
return IUP_DEFAULT;
}
IupSetfAttribute(multitext, "FOLDTOGGLE", "%d", lin);
IupSetfAttribute(multitext, "CARET", "%d:0", lin);
return IUP_DEFAULT;
}
static int item_fold_collapse_action_cb(Ihandle* ih)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih);
IupSetAttribute(multitext, "FOLDALL", "CONTRACT");
return IUP_DEFAULT;
}
static int item_fold_expand_action_cb(Ihandle* ih)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih);
IupSetAttribute(multitext, "FOLDALL", "EXPAND");
return IUP_DEFAULT;
}
static int item_fold_toggle_action_cb(Ihandle* ih)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih);
IupSetAttribute(multitext, "FOLDALL", "TOGGLE");
return IUP_DEFAULT;
}
static int item_fold_level_action_cb(Ihandle* ih_item)
{
int level = 0, action = 0;
Ihandle* config = get_config(ih_item);
const char* value = IupConfigGetVariableStr(config, "IupVisualLED", "FoldAllLevel");
if (value) iupStrToInt(value, &level);
value = IupConfigGetVariableStr(config, "IupVisualLED", "FoldAllLevelAction");
if (value) iupStrToInt(value, &action);
if (IupGetParam("Fold All by Level", setparent_param_cb, IupGetDialog(ih_item),
"Level: %i\n"
"Options: %o|Collapse|Expand|Toggle|\n",
&level, &action, NULL))
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
int lin, count = IupGetInt(multitext, "LINECOUNT");
IupConfigSetVariableInt(config, "IupVisualLED", "FoldAllLevel", level);
IupConfigSetVariableInt(config, "IupVisualLED", "FoldAllLevelAction", action);
for (lin = 0; lin < count; lin++)
{
if (IupGetIntId(multitext, "FOLDLEVELHEADER", lin))
{
int foldLevel = IupGetIntId(multitext, "FOLDLEVEL", lin);
if (foldLevel + 1 == level) /* level at header is different from child */
{
switch (action)
{
case 0: /* Collapse */
if (IupGetIntId(multitext, "FOLDEXPANDED", lin))
IupSetfAttribute(multitext, "FOLDTOGGLE", "%d", lin);
break;
case 1: /* Expand */
if (!IupGetIntId(multitext, "FOLDEXPANDED", lin))
IupSetfAttribute(multitext, "FOLDTOGGLE", "%d", lin);
break;
case 2: /* Toggle */
IupSetfAttribute(multitext, "FOLDTOGGLE", "%d", lin);
break;
}
}
}
}
}
return IUP_DEFAULT;
}
static int item_comment_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *sel = IupGetAttribute(multitext, "SELECTION");
char *text_line;
int lin, col, lin1, lin2;
if (sel)
{
int col1, col2;
sscanf(sel, "%d,%d:%d,%d", &lin1, &col1, &lin2, &col2);
}
else
{
lin1 = IupGetInt(multitext, "CARET");
lin2 = lin1;
}
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
for (lin = lin1; lin <= lin2; lin++)
{
int len, pos;
text_line = IupGetAttributeId(multitext, "LINE", lin);
len = (int)strlen(text_line);
for (col = 0; col < len; col++)
{
char c = text_line[col];
if (c != ' ' && c != '\t')
break;
}
IupTextConvertLinColToPos(multitext, lin, col, &pos);
IupSetAttributeId(multitext, "INSERT", pos, "# ");
}
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_uncomment_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *sel = IupGetAttribute(multitext, "SELECTION");
char *text_line;
int lin, col, lin1, lin2;
if (sel)
{
int col1, col2;
sscanf(sel, "%d,%d:%d,%d", &lin1, &col1, &lin2, &col2);
}
else
{
lin1 = IupGetInt(multitext, "CARET");
lin2 = lin1;
}
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
for (lin = lin1; lin <= lin2; lin++)
{
int len, pos, nChar;
text_line = IupGetAttributeId(multitext, "LINE", lin);
len = (int)strlen(text_line);
nChar = 0;
for (col = 0; col < len; col++)
{
if (text_line[col] == '#')
{
nChar = 1;
if (text_line[col + 2] == ' ')
nChar++;
break;
}
}
if (nChar == 0)
continue;
IupTextConvertLinColToPos(multitext, lin, col, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, nChar);
}
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_load_action_cb(Ihandle *ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
Ihandle* elem_tree = vLedGetElemTree(multitext);
int modified = IupGetInt(multitext, "MODIFIED");
char *filename = get_filename(multitext);
unload_led(multitext, filename);
IupSetAttribute(multitext, "LOADED", NULL);
if (modified || !IupGetAttribute(multitext, "FILENAME"))
load_led(elem_tree, filename, 1);
else
load_led(elem_tree, filename, 0);
return IUP_DEFAULT;
}
static int item_unload_action_cb(Ihandle *ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
Ihandle* elem_tree = vLedGetElemTree(multitext);
char *filename = get_filename(multitext);
unload_led(multitext, filename);
IupSetAttribute(multitext, "LOADED", NULL);
IupSetAttribute(elem_tree, "DELNODE0", "ALL");
enable_elem_tools_buttons(elem_tree, 0, NULL);
return IUP_DEFAULT;
}
static char* readFile(const char* filename)
{
long size;
char* str;
FILE* file = fopen(filename, "rb");
if (!file)
return NULL;
/* calculate file size */
fseek(file, 0, SEEK_END);
size = ftell(file);
if (size <= 0)
{
fclose(file);
return NULL;
}
/* allocate memory for the file contents + nul terminator */
str = malloc(size + 1);
if (!str)
{
fclose(file);
return NULL;
}
/* read all data at once */
fseek(file, 0, SEEK_SET);
fread(str, size, 1, file);
/* set the null terminator */
str[size] = 0;
fclose(file);
return str;
}
static void vLedExport(Ihandle* multitext, const char* src_filename, const char* dst_filename, int export_format);
static void rewrite_led(Ihandle* multitext)
{
char tempFilename[10240];
if (iupStrTmpFileName(tempFilename, "~vled"))
{
char* new_buffer;
char *filename = get_filename(multitext);
vLedExport(multitext, filename, tempFilename, IUP_LAYOUT_EXPORT_LED);
new_buffer = readFile(tempFilename);
if (new_buffer)
{
Ihandle* elem_tree = vLedGetElemTree(multitext);
IupSetStrAttribute(multitext, "VALUE", new_buffer);
IupSetInt(multitext, "MARKERDELETEALL", 1);
updateElemTree(elem_tree, filename);
free(new_buffer);
}
remove(tempFilename);
}
}
static int item_rewrite_action_cb(Ihandle *ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
rewrite_led(multitext);
return IUP_DEFAULT;
}
static int item_autoload_action_cb(Ihandle *ih_item)
{
Ihandle* config = get_config(ih_item);
if (IupGetInt(ih_item, "VALUE"))
IupConfigSetVariableInt(config, "IupVisualLED", "AutoLoad", 1);
else
IupConfigSetVariableInt(config, "IupVisualLED", "AutoLoad", 0);
return IUP_DEFAULT;
}
static int item_import_img_action_cb(Ihandle *ih_item)
{
Ihandle* config = get_config(ih_item);
Ihandle* filedlg = IupFileDlg();
const char* dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastImageDirectory");
if (!dir) dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastDirectory");
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttribute(filedlg, "DIALOGTYPE", "OPEN");
IupSetAttribute(filedlg, "TITLE", "Load Image File(s)");
IupSetAttribute(filedlg, "MULTIPLEFILES", "YES");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", IupGetDialog(ih_item));
IupSetAttribute(filedlg, "ICON", IupGetGlobal("ICON"));
IupSetAttribute(filedlg, "EXTFILTER", "Image Files|*.bmp;*.gif;*.jpg;*.png;*.tif;*.tga|All Files|*.*|");
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
int i, ret =0 , count = IupGetInt(filedlg, "MULTIVALUECOUNT");
dir = IupGetAttributeId(filedlg, "MULTIVALUE", 0);
for (i = 1; i < count; i++) /* i==0 contains the path */
{
char* img_filetitle = IupGetAttributeId(filedlg, "MULTIVALUE", i);
char img_filename[10240];
strcpy(img_filename, dir);
strcat(img_filename, img_filetitle);
ret |= LoadImageFile(ih_item, img_filename);
}
IupConfigSetVariableStr(config, "IupVisualLED", "LastImageDirectory", dir);
if (ret)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
Ihandle* elem_tree = vLedGetElemTree(multitext);
char *filename = get_filename(multitext);
updateElemTree(elem_tree, filename);
}
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int item_export_img_cb(Ihandle *ih_item)
{
char* folder;
int i, num_images, num_names = IupGetAllNames(NULL, -1);
char* *names;
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *filename = get_filename(multitext);
const char *img_type = get_img_fileformat();
if (!img_type)
return IUP_DEFAULT;
folder = getfolder(ih_item);
if (!folder)
return IUP_DEFAULT;
names = malloc(sizeof(char*)*num_names);
IupGetAllNames(names, num_names);
num_images = 0;
for (i = 0; i < num_names; i++)
{
Ihandle *elem = IupGetHandle(names[i]);
if (!iupObjectCheck(elem))
continue;
if (elem->iclass->nativetype != IUP_TYPEIMAGE)
continue;
/* save only loaded images of the current file */
if (!vLedIsAlien(elem, filename))
{
char img_filename[10240] = "";
char buff[80];
strcpy(img_filename, folder);
strcat(img_filename, "/");
strcat(img_filename, strGetFileTitle(filename));
strcat(img_filename, "_");
strcat(img_filename, names[i]);
iupStrLower(buff, img_type);
strcat(img_filename, ".");
strcat(img_filename, buff);
if (!IupSaveImage(elem, img_filename, img_type))
{
char* err_msg = IupGetGlobal("IUPIM_LASTERROR");
if (err_msg)
IupMessageError(IupGetDialog(ih_item), err_msg);
return IUP_DEFAULT;
}
num_images++;
}
}
if (num_images == 0)
{
IupMessageError(IupGetDialog(ih_item), "No images.");
return IUP_DEFAULT;
}
return IUP_DEFAULT;
}
static int showimages_close_cb(void)
{
return IUP_CLOSE;
}
static int showimages_inactivetoggle_cb(Ihandle* toggle, int v)
{
Ihandle* tabs = (Ihandle*)IupGetAttribute(toggle, "TABS");
Ihandle* child = IupGetNextChild(tabs, NULL);
while (child)
{
IupSetAttribute(child, "ACTIVE", v ? "NO" : "YES");
child = IupGetNextChild(tabs, child);
}
return IUP_DEFAULT;
}
static int showimages_imagebutton_cb(Ihandle* button)
{
Ihandle* label = (Ihandle*)IupGetAttribute(button, "_INFO_LABEL");
IupSetAttribute(label, "TITLE", IupGetAttribute(button, "_INFO"));
return IUP_DEFAULT;
}
static int item_show_all_img_cb(Ihandle *ih_item)
{
Ihandle *dialog, *box, *files, *tabs, *toggle, *label;
Ihandle* params[500];
int show_stock = iupAttribGetInt(ih_item, "_IUP_SHOWSTOCK");
int num_tabs = 0, num_images;
int i, num_names = IupGetAllNames(NULL, -1);
char* *names = malloc(sizeof(char*)*num_names);
Ihandle* *images = malloc(sizeof(Ihandle*)*num_names);
IupGetAllNames(names, num_names);
files = IupUser();
num_images = 0;
for (i = 0; i < num_names; i++)
{
Ihandle *elem = IupGetHandle(names[i]);
if (!iupObjectCheck(elem))
continue;
if (elem->iclass->nativetype == IUP_TYPEIMAGE)
{
/* if stock show only NOT loaded images */
if (show_stock && iupAttribGet(elem, "_IUPLED_FILENAME"))
continue;
/* if not stock show only loaded images */
if (!show_stock && !iupAttribGet(elem, "_IUPLED_FILENAME"))
continue;
if (iupStrEqualPartial(names[i], "_IUP_NAME")) /* ignore internal names */
continue;
images[num_images] = elem;
num_images++;
}
}
if (num_images == 0)
{
IupMessageError(IupGetDialog(ih_item), "No images.");
free(names);
free(images);
return IUP_DEFAULT;
}
qsort(images, num_images, sizeof(Ihandle*), compare_image_names);
for (i = 0; i < num_images; i++)
{
Ihandle *tbox, *lbox, *button, *elem;
char* name;
char* filename;
elem = images[i];
name = vLedGetName(elem);
if (show_stock)
{
if (iupAttribGet(elem, "_IUPIMAGE_STOCK_LOAD"))
filename = "IupImgLib";
else
filename = "Internal";
}
else
filename = iupAttribGet(elem, "_IUPLED_FILENAME");
if (!filename)
continue;
tbox = (Ihandle*)IupGetAttribute(files, filename);
if (!tbox)
{
char* file_title = strGetFileTitle(filename);
tbox = IupVbox(NULL);
IupSetAttribute(files, filename, (char*)tbox);
IupSetStrAttribute(tbox, "TABTITLE", file_title);
free(file_title);
params[num_tabs] = tbox;
num_tabs++;
}
lbox = (Ihandle*)IupGetAttribute(tbox, filename);
if (!lbox || IupGetInt(lbox, "LINE_COUNT") == 10)
{
lbox = IupHbox(NULL);
IupAppend(tbox, lbox);
IupSetAttribute(tbox, filename, (char*)lbox);
IupSetAttribute(lbox, "LINE_COUNT", "0");
}
button = IupButton("", NULL);
IupSetStrAttribute(button, "IMAGE", name);
IupSetAttribute(button, "PADDING", "5x5");
IupSetAttribute(button, "FLAT", "Yes");
IupSetfAttribute(button, "_INFO", "%s [%d,%d] - %s", name, IupGetInt(elem, "WIDTH"), IupGetInt(elem, "HEIGHT"), IupGetClassName(elem));
IupSetCallback(button, "ACTION", (Icallback)showimages_imagebutton_cb);
IupSetCallback(button, "GETFOCUS_CB", (Icallback)showimages_imagebutton_cb);
IupAppend(lbox, button);
IupSetfAttribute(lbox, "LINE_COUNT", "%d", IupGetInt(lbox, "LINE_COUNT") + 1);
}
params[num_tabs] = NULL;
box = IupVbox(toggle = IupToggle("INACTIVE", NULL),
tabs = IupTabsv(params),
label = IupLabel(""),
NULL);
IupSetAttribute(box, "MARGIN", "10x10");
IupSetAttribute(box, "GAP", "10");
IupSetAttribute(tabs, "ALIGNMENT", "NW");
IupSetAttribute(tabs, "SIZE", "150x80");
IupSetCallback(toggle, "ACTION", (Icallback)showimages_inactivetoggle_cb);
IupSetAttribute(toggle, "TABS", (char*)tabs);
IupSetAttribute(label, "EXPAND", "HORIZONTAL");
dialog = IupDialog(box);
IupSetAttribute(dialog, "TITLE", show_stock? "Stock Images": "All Images");
IupSetCallback(dialog, "CLOSE_CB", (Icallback)showimages_close_cb);
IupSetAttribute(dialog, "_INFO_LABEL", (char*)label);
IupSetAttributeHandle(dialog, "PARENTDIALOG", IupGetDialog(ih_item));
IupPopup(dialog, IUP_CENTERPARENT, IUP_CENTERPARENT);
IupDestroy(dialog);
IupDestroy(files);
free(names);
free(images);
return IUP_DEFAULT;
}
static int item_show_stock_img_cb(Ihandle *ih_item)
{
iupImageStockLoadAll();
iupAttribSet(ih_item, "_IUP_SHOWSTOCK", "1");
item_show_all_img_cb(ih_item);
iupAttribSet(ih_item, "_IUP_SHOWSTOCK", NULL);
return IUP_DEFAULT;
}
static void iExportRemoveExt(char* title, const char* ext)
{
int len = (int)strlen(title);
int len_ext = (int)strlen(ext);
if (len_ext == 1)
{
if (tolower(title[len - 1]) == ext[0] &&
title[len - 2] == '.')
title[len - 2] = 0; /* place terminator at dot */
}
else
{
if (tolower(title[len - 1]) == ext[2] &&
tolower(title[len - 2]) == ext[1] &&
tolower(title[len - 3]) == ext[0] &&
title[len - 4] == '.')
title[len - 4] = 0; /* place terminator at dot */
}
}
static void iLayoutFindNamedElem(const char* src_filename, Iarray* names_array)
{
char* *names;
int num_names;
Ihandle* *named_elem = NULL;
int i, count = 0;
num_names = IupGetAllNames(NULL, -1);
names = malloc(sizeof(char*)*num_names);
IupGetAllNames(names, num_names);
for (i = 0; i < num_names; i++)
{
Ihandle *elem = IupGetHandle(names[i]);
if (elem)
{
if (iupStrEqualPartial(names[i], "_IUP_NAME") ||
vLedIsAlien(elem, src_filename))
continue;
named_elem = iupArrayAdd(names_array, 1);
named_elem[count] = elem;
count++;
}
}
free(names);
}
static void vLedExport(Ihandle* multitext, const char* src_filename, const char* dst_filename, int export_format)
{
Iarray* names_array;
Ihandle* *named_elem;
int count;
FILE* file;
char* title = NULL;
names_array = iupArrayCreate(1024, sizeof(Ihandle*)); /* just set an initial size, but count is 0 */
/* lists all elements that have non automatic names and
were parsed from the filename */
iLayoutFindNamedElem(src_filename, names_array);
count = iupArrayCount(names_array);
named_elem = iupArrayGetData(names_array);
if (count == 0)
{
iupArrayDestroy(names_array);
return;
}
file = fopen(dst_filename, "wb");
if (!file)
{
iupArrayDestroy(names_array);
return;
}
qsort(named_elem, count, sizeof(Ihandle*), compare_named_handles);
if (export_format == IUP_LAYOUT_EXPORT_LUA)
{
title = iupStrFileGetTitle(dst_filename);
iExportRemoveExt(title, "lua");
iupStrReplaceReserved(title, '_');
fprintf(file, "-- Generated by IupVisualLED export to Lua.\n\n");
}
else if (export_format == IUP_LAYOUT_EXPORT_C)
{
title = iupStrFileGetTitle(dst_filename);
iExportRemoveExt(title, "c");
iupStrReplaceReserved(title, '_');
fprintf(file, "/* Generated by IupVisualLED export to C. */\n\n");
fprintf(file, "#include <stdlib.h>\n");
fprintf(file, "#include <iup.h>\n\n");
}
else /* IUP_LAYOUT_EXPORT_LED */
{
char* comments;
fprintf(file, "# Generated by IupVisualLED export to LED.\n\n");
if (multitext)
comments = iupAttribGet(multitext, "_IUPLED_COMMENTS");
else
comments = load_comments(src_filename);
if (comments)
fprintf(file, "%s", comments);
if (comments && !multitext)
free(comments);
}
/* export all images as individual functions */
iupLayoutExportNamedImageList(file, named_elem, count, export_format);
if (export_format == IUP_LAYOUT_EXPORT_LUA)
{
fprintf(file, "function create_layout_%s()\n", title);
}
else if (export_format == IUP_LAYOUT_EXPORT_C)
{
fprintf(file, "void create_layout_%s(void)\n", title);
fprintf(file, "{\n");
}
iupLayoutExportNamedElemList(file, named_elem, count, export_format, 1); /* export all the attributes that were loaded form the LED */
/* call the image functions */
iupLayoutExportNamedImageListSetHandle(file, named_elem, count, export_format);
if (export_format == IUP_LAYOUT_EXPORT_LUA)
fprintf(file, "\nend\n");
else if (export_format == IUP_LAYOUT_EXPORT_C)
fprintf(file, "\n}\n");
if (title)
free(title);
iupArrayDestroy(names_array);
fclose(file);
}
static void strAddExtension(char* filename, const char* ext)
{
char* new_ext = iupStrFileGetExt(filename);
if (!new_ext)
{
strcat(filename, ".");
strcat(filename, ext);
}
free(new_ext);
}
static int ivLedGetExportFile(Ihandle* ih, char* export_filename, const char *extfilter)
{
Ihandle *filedlg = 0;
int ret;
Ihandle* config = get_config(ih);
const char* dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastExportDirectory");
if (!dir) dir = IupConfigGetVariableStr(config, "IupVisualLED", "LastDirectory");
filedlg = IupFileDlg();
IupSetStrAttribute(filedlg, "EXTFILTER", extfilter);
IupSetStrAttribute(filedlg, "FILE", export_filename);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
IupSetAttribute(filedlg, "ALLOWNEW", "YES");
IupSetAttribute(filedlg, "NOCHANGEDIR", "YES");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", IupGetDialog(ih));
IupSetAttribute(filedlg, "ICON", IupGetGlobal("ICON"));
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
ret = IupGetInt(filedlg, "STATUS");
if (ret != -1)
{
char* ext = iupStrFileGetExt(export_filename);
char* value = IupGetAttribute(filedlg, "VALUE");
strcpy(export_filename, value);
strAddExtension(export_filename, ext);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, "IupVisualLED", "LastExportDirectory", dir);
free(ext);
}
IupDestroy(filedlg);
return ret;
}
static int item_export_led_action_cb(Ihandle *ih_item)
{
int ret;
char export_filename[4096];
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *filename = get_filename(multitext);
char* title = iupStrFileGetTitle(filename);
char *ext = strrchr(title, '.');
if (ext) *ext = 0;
strcpy(export_filename, title);
strcat(export_filename, ".led");
ret = ivLedGetExportFile(ih_item, export_filename, "LED Files|*.led|All Files|*.*|");
if (ret != -1) /* ret==0 existing file. TODO: check if export_filename is opened. */
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_LED);
return IUP_DEFAULT;
}
static int item_export_lua_action_cb(Ihandle *ih_item)
{
int ret;
char export_filename[4096];
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *filename = get_filename(multitext);
char* title = iupStrFileGetTitle(filename);
char *ext = strrchr(title, '.');
if (ext) *ext = 0;
strcpy(export_filename, title);
strcat(export_filename, ".lua");
ret = ivLedGetExportFile(ih_item, export_filename, "Lua Files|*.lua|All Files|*.*|");
if (ret != -1) /* ret==0 existing file. TODO: check if export_filename is opened. */
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_LUA);
return IUP_DEFAULT;
}
static int item_export_c_action_cb(Ihandle *ih_item)
{
int ret;
char export_filename[4096];
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *filename = get_filename(multitext);
char* title = iupStrFileGetTitle(filename);
char *ext = strrchr(title, '.');
if (ext) *ext = 0;
strcpy(export_filename, title);
strcat(export_filename, ".c");
ret = ivLedGetExportFile(ih_item, export_filename, "C Files|*.c|All Files|*.*|");
if (ret != -1) /* ret==0 existing file. TODO: check if export_filename is opened. */
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_C);
return IUP_DEFAULT;
}
static int item_export_all_open_action_cb(Ihandle *ih_item)
{
char *itemName = IupGetAttribute(ih_item, "NAME");
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
int count = IupGetInt(tabs, "COUNT");
char *folder;
int i;
folder = getfolder(ih_item);
if (!folder)
return IUP_DEFAULT;
for (i = 0; i < count; i++)
{
char export_filename[10240];
Ihandle *multitext = IupGetChild(tabs, i);
char *filename = get_filename(multitext);
char* title = iupStrFileGetTitle(filename);
char *ext = strrchr(title, '.');
if (ext) *ext = 0;
strcpy(export_filename, folder);
strcat(export_filename, "\\");
strcat(export_filename, title);
if (strcmp(itemName, "ITM_EXPORT_OPEN_LED") == 0)
{
strcat(export_filename, ".led");
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_LED);
}
else if (strcmp(itemName, "ITM_EXPORT_OPEN_LUA") == 0)
{
strcat(export_filename, ".lua");
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_LUA);
}
else
{
strcat(export_filename, ".c");
vLedExport(multitext, filename, export_filename, IUP_LAYOUT_EXPORT_C);
}
}
return IUP_DEFAULT;
}
static int item_export_proj_action_cb(Ihandle *ih_item)
{
char *itemName = IupGetAttribute(ih_item, "NAME");
Ihandle* projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
int count = IupGetInt(projectTree, "CHILDCOUNT0");
int i;
char *folder = getfolder(ih_item);
if (!folder)
return IUP_DEFAULT;
for (i = 1; i <= count; i++)
{
char export_filename[10240];
char* filename = IupTreeGetUserId(projectTree, i);
char* title = iupStrFileGetTitle(filename);
char *ext = strrchr(title, '.');
if (ext) *ext = 0;
strcpy(export_filename, folder);
strcat(export_filename, "\\");
strcat(export_filename, title);
if (strcmp(itemName, "ITM_EXP_PROJ_LED") == 0)
{
strcat(export_filename, ".led");
vLedExport(NULL, filename, export_filename, IUP_LAYOUT_EXPORT_LED);
}
else if (strcmp(itemName, "ITM_EXP_PROJ_LUA") == 0)
{
strcat(export_filename, ".lua");
vLedExport(NULL, filename, export_filename, IUP_LAYOUT_EXPORT_LUA);
}
else
{
strcat(export_filename, ".c");
vLedExport(NULL, filename, export_filename, IUP_LAYOUT_EXPORT_C);
}
}
return IUP_DEFAULT;
}
static int item_use_utf_8_action_cb(Ihandle *ih_item)
{
Ihandle* bt;
int utf8;
Ihandle* config = get_config(ih_item);
if (IupGetInt(ih_item, "VALUE"))
{
IupSetGlobal("UTF8MODE", "Yes");
IupConfigSetVariableStr(config, "IupVisualLED", "UTF-8", "Yes");
utf8 = 1;
#ifdef USE_UTF8_VC
IupSetGlobal("UTF8MODE_FILE", "Yes");
setlocale(LC_ALL, ".UTF8");
#endif
}
else
{
IupSetGlobal("UTF8MODE", NULL);
IupConfigSetVariableStr(config, "IupVisualLED", "UTF-8", NULL);
utf8 = 0;
#ifdef USE_UTF8_VC
IupSetGlobal("UTF8MODE_FILE", "No");
setlocale(LC_ALL, "");
#endif
}
bt = IupGetDialogChild(ih_item, "BUTTON_WORDWRAP");
IupSetAttribute(bt, "TITLE", utf8 ? "W\xC2\xAC" : "W\xAC");
bt = IupGetDialogChild(ih_item, "BUTTON_SHOWWHITE");
IupSetAttribute(bt, "TITLE", utf8 ? "a\xC2\xB7\x62" : "a\xB7\x62");
bt = IupGetDialogChild(ih_item, "BUTTON_SHOWEOL");
IupSetAttribute(bt, "TITLE", utf8 ? "\xC2\xB6" : "\xB6");
return IUP_DEFAULT;
}
static int item_imageexport_static_action_cb(Ihandle *ih_item)
{
Ihandle* config = get_config(ih_item);
if (IupGetInt(ih_item, "VALUE"))
{
IupSetGlobal("IMAGEEXPORT_STATIC", "Yes");
IupConfigSetVariableStr(config, "IupVisualLED", "ImageExportStatic", "Yes");
}
else
{
IupSetGlobal("IMAGEEXPORT_STATIC", NULL);
IupConfigSetVariableStr(config, "IupVisualLED", "ImageExportStatic", NULL);
}
return IUP_DEFAULT;
}
static int tree_selection_cb(Ihandle* elem_tree, int id, int status)
{
if (status == 1)
{
Ihandle* bt;
Ihandle* elem = (Ihandle*)IupTreeGetUserId(elem_tree, id);
Ihandle* properties_dlg = (Ihandle*)IupGetAttribute(IupGetParent(elem_tree), "PROPERTIES_DIALOG");
if (properties_dlg && IupGetInt(properties_dlg, "VISIBLE"))
iupLayoutPropertiesUpdate(properties_dlg, elem);
bt = IupGetDialogChild(elem_tree, "ELEM_LAYOUT_BUTTON");
if (IupGetDialog(elem))
IupSetAttribute(bt, "ACTIVE", "Yes");
else
IupSetAttribute(bt, "ACTIVE", "No");
bt = IupGetDialogChild(elem_tree, "ELEM_IMAGE_BUTTON");
if (elem->iclass->nativetype == IUP_TYPEIMAGE)
IupSetAttribute(bt, "ACTIVE", "Yes");
else
IupSetAttribute(bt, "ACTIVE", "No");
}
return IUP_DEFAULT;
}
static void search_in_text(Ihandle* multitext, const char* str)
{
int pos_start, pos_end, find_start, find_end;
IupSetAttribute(multitext, "SEARCHFLAGS", "WHOLEWORD");
find_start = 0;
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
IupSetAttribute(multitext, "SEARCHINTARGET", str);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
if (pos_start != 0 || pos_end != find_end)
{
IupSetFocus(multitext);
IupSetInt(multitext, "CARETPOS", pos_start);
IupSetInt(multitext, "SCROLLTOPOS", pos_start);
IupSetfAttribute(multitext, "SELECTIONPOS", "%d:%d", pos_start, pos_end);
}
}
static int tree_executeleaf_cb(Ihandle* elem_tree, int id)
{
Ihandle* multitext = vLedGetCurrentMultitext(elem_tree);
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
char *filename = get_filename(multitext);
char *name = vLedGetName(elem);
Ihandle *parent = elem;
int link;
while(!name)
{
parent = IupGetParent(parent);
if (!parent)
break;
name = vLedGetName(parent);
}
if (!name)
return IUP_DEFAULT;
if (vLedIsAlien(elem, filename) || iupAttribGet(elem, "_IUPLED_NOTDEF_NAME"))
return IUP_DEFAULT;
link = IupGetIntId(elem_tree, "LINK", id);
if (link)
{
int i, root_count = IupGetInt(elem_tree, "ROOTCOUNT");
id = 0;
for (i = 0; i < root_count; i++)
{
if (elem == (Ihandle *)IupTreeGetUserId(elem_tree, id))
{
IupSetInt(elem_tree, "VALUE", id);
break;
}
id = IupGetIntId(elem_tree, "NEXT", id);
}
}
search_in_text(multitext, name);
return IUP_DEFAULT;
}
static Ihandle* get_elem_tree(Ihandle* dlg)
{
Ihandle* multitext = vLedGetCurrentMultitext(dlg);
Ihandle* elem_tree = vLedGetElemTree(multitext);
return elem_tree;
}
static int elem_locate_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = !IupClassMatch(ih_item, "item") ? get_elem_tree(ih_item) : (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
int id = IupGetInt(elem_tree, "VALUE");
tree_executeleaf_cb(elem_tree, id);
return IUP_DEFAULT;
}
static int elem_collapse_all_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
IupSetAttribute(elem_tree, "EXPANDALL", "NO");
return IUP_DEFAULT;
}
static int elem_expand_all_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
IupSetAttribute(elem_tree, "EXPANDALL", "YES");
return IUP_DEFAULT;
}
static int elem_goto_parent_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
int id = IupGetInt(elem_tree, "VALUE");
if (IupGetAttributeId(elem_tree, "PARENT", id) != NULL)
{
id = IupGetIntId(elem_tree, "PARENT", id);
IupSetInt(elem_tree, "VALUE", id);
}
return IUP_DEFAULT;
}
static int elem_goto_brother_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
int id = IupGetInt(elem_tree, "VALUE");
if (IupGetAttributeId(elem_tree, "NEXT", id) != NULL)
{
id = IupGetIntId(elem_tree, "NEXT", id);
IupSetInt(elem_tree, "VALUE", id);
}
return IUP_DEFAULT;
}
static int globalsdlg_cb(Ihandle* ih)
{
Ihandle* config = get_config(ih);
Ihandle* dlg = IupGetDialog(ih);
Ihandle* globals_dlg = (Ihandle*)IupGetAttribute(dlg, "GLOBALS_DIALOG");
if (!globals_dlg)
{
globals_dlg = IupGlobalsDialog();
IupSetAttributeHandle(globals_dlg, "PARENTDIALOG", dlg);
IupSetAttribute(dlg, "GLOBALS_DIALOG", (char*)globals_dlg);
}
IupConfigSetVariableInt(config, "GlobalsDialog", "Maximized", 0);
IupConfigDialogShow(config, globals_dlg, "GlobalsDialog");
return IUP_DEFAULT;
}
static int classinfo_cb(Ihandle* ih)
{
Ihandle* config = get_config(ih);
Ihandle* dlg = IupGetDialog(ih);
Ihandle* classinfo_dlg = (Ihandle*)IupGetAttribute(dlg, "CLASSINFO_DIALOG");
if (!classinfo_dlg)
{
classinfo_dlg = IupClassInfoDialog(dlg);
IupSetAttribute(dlg, "CLASSINFO_DIALOG", (char*)classinfo_dlg);
}
IupConfigSetVariableInt(config, "ClassInfoDialog", "Maximized", 0);
IupConfigDialogShow(config, classinfo_dlg, "ClassInfoDialog");
return IUP_DEFAULT;
}
static void iLayoutFixChildLedLines(Ihandle* parent, const char* filename)
{
Ihandle *child;
int parent_line = iupAttribGetInt(parent, "_IUPLED_LINE");
for (child = parent->firstchild; child; child = child->brother)
{
if (!(child->flags & IUP_INTERNAL))
{
if (!vLedIsAlien(child, filename) && vLedGetName(child))
iupAttribSetInt(child, "_IUPLED_LINE", parent_line - 1);
iLayoutFixChildLedLines(child, filename);
}
}
}
static void update_led_line(Ihandle* elem, const char *filename)
{
if (!iupAttribGet(elem, "_IUPLED_LINE"))
{
Ihandle* parent = elem->parent;
while (parent && !vLedIsAlien(parent, filename))
{
int parent_line = iupAttribGetInt(parent, "_IUPLED_LINE");
if (parent_line)
{
iupAttribSetInt(elem, "_IUPLED_LINE", parent_line - 1);
break;
}
parent = parent->parent;
}
}
else
{
Ihandle* parent = elem->parent;
int elem_line = iupAttribGetInt(elem, "_IUPLED_LINE");
int rebuild_lines = 0;
while (parent && !vLedIsAlien(parent, filename))
{
int parent_line = iupAttribGetInt(parent, "_IUPLED_LINE");
if (parent_line < elem_line) /* inconsistent */
{
while (parent->parent && !vLedIsAlien(parent->parent, filename))
parent = parent->parent;
rebuild_lines = 1;
break;
}
parent = parent->parent;
}
if (rebuild_lines)
iLayoutFixChildLedLines(parent, filename);
}
}
static int layoutchanged_cb(Ihandle* dlg, Ihandle* elem)
{
Ihandle* multitext = (Ihandle*)IupGetAttribute(dlg, "MULTITEXT");
if (elem)
{
char *filename = get_filename(multitext);
if (!iupAttribGet(elem, "_IUPLED_FILENAME")) /* new element */
iupAttribSetStr(elem, "_IUPLED_FILENAME", filename);
if (vLedGetName(elem)) /* if it has name then it must have a line for controlling export order */
update_led_line(elem, filename);
}
rewrite_led(multitext);
return IUP_DEFAULT;
}
static int attribchanged_cb(Ihandle* dlg, char* name) /* called for layout_dlg and properties_dlg */
{
Ihandle* multitext = (Ihandle*)IupGetAttribute(dlg, "MULTITEXT");
Ihandle* elem = (Ihandle*)IupGetAttribute(dlg, "ELEM");
char led_name[200] = "_IUPLED_SAVED_";
strcat(led_name, name);
iupAttribSet(elem, led_name, "1");
rewrite_led(multitext);
return IUP_DEFAULT;
}
static int elem_layoutdlg_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = !IupClassMatch(ih_item, "item") ? get_elem_tree(ih_item) : (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
Ihandle* multitext = vLedGetCurrentMultitext(elem_tree);
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
Ihandle* dialog = IupGetDialog(elem);
if (dialog)
{
Ihandle* layout_dlg = IupLayoutDialog(dialog);
IupSetCallback(layout_dlg, "ATTRIBCHANGED_CB", (Icallback)attribchanged_cb);
IupSetCallback(layout_dlg, "LAYOUTCHANGED_CB", (Icallback)layoutchanged_cb);
IupSetAttribute(layout_dlg, "MULTITEXT", (char*)multitext);
IupShow(layout_dlg); /* LayoutDialog is automatically destroyed on close */
}
else
IupMessageError(IupGetDialog(elem_tree), "The element must be a dialog or be inside a dialog.");
return IUP_DEFAULT;
}
static int item_newlayout_cb(Ihandle* ih_bt)
{
Ihandle* layout_dlg, *new_dialog;
Ihandle* multitext = vLedGetCurrentMultitext(ih_bt);
char *filename = get_filename(multitext);
Ihandle* elem_tree = vLedGetElemTree(multitext);
char new_name[50];
int caret_line, caret_pos;
static int new_dlg_count = 1;
sprintf(new_name, "new_dialog%d", new_dlg_count);
new_dlg_count++;
caret_line = IupGetInt(multitext, "CARET");
IupTextConvertLinColToPos(multitext, caret_line, 0, &caret_pos);
IupSetStrfId(multitext, "INSERT", caret_pos, "%s = DIALOG()\n\n", new_name);
new_dialog = IupDialog(NULL);
IupSetHandle(new_name, new_dialog);
iupAttribSetStr(new_dialog, "_IUPLED_FILENAME", filename);
iupAttribSetInt(new_dialog, "_IUPLED_LINE", caret_line);
updateElemTree(elem_tree, filename);
layout_dlg = IupLayoutDialog(new_dialog);
IupSetCallback(layout_dlg, "ATTRIBCHANGED_CB", (Icallback)attribchanged_cb);
IupSetCallback(layout_dlg, "LAYOUTCHANGED_CB", (Icallback)layoutchanged_cb);
IupSetAttribute(layout_dlg, "MULTITEXT", (char*)multitext);
IupShow(layout_dlg); /* LayoutDialog is automatically destroyed on close */
return IUP_DEFAULT;
}
static int imagechanged_cb(Ihandle* image_editor_dlg)
{
Ihandle* dlg = IupGetAttributeHandle(image_editor_dlg, "PARENTDIALOG");
Ihandle* multitext = vLedGetCurrentMultitext(dlg);
rewrite_led(multitext);
return IUP_DEFAULT;
}
static int elem_imagedlg_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = !IupClassMatch(ih_item, "item") ? get_elem_tree(ih_item) : (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
Ihandle* multitext = vLedGetCurrentMultitext(elem_tree);
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
Ihandle* config = get_config(elem_tree);
Ihandle* image_editor_dlg = (Ihandle*)IupGetAttribute(IupGetDialog(multitext), "IMAGE_EDITOR_DIALOG");
if (!image_editor_dlg)
{
image_editor_dlg = vLedImageEditorCreate(IupGetDialog(elem_tree), config);
IupSetCallback(image_editor_dlg, "IMAGECHANGED_CB", (Icallback)imagechanged_cb);
IupSetAttribute(IupGetDialog(multitext), "IMAGE_EDITOR_DIALOG", (char*)image_editor_dlg);
}
IupConfigSetVariableInt(config, "ImageEditorDialog", "Maximized", 0);
IupConfigDialogShow(config, image_editor_dlg, "ImageEditorDialog");
vLedImageEditorSetImage(image_editor_dlg, elem, IupGetName(elem));
IupPopup(image_editor_dlg, IUP_CURRENT, IUP_CURRENT);
return IUP_DEFAULT;
}
static int item_newimage_cb(Ihandle* ih_item)
{
Ihandle* multitext = vLedGetCurrentMultitext(ih_item);
char *filename = get_filename(multitext);
Ihandle* config = get_config(ih_item);
Ihandle* image_editor_dlg = (Ihandle*)IupGetAttribute(IupGetDialog(multitext), "IMAGE_EDITOR_DIALOG");
if (!image_editor_dlg)
{
image_editor_dlg = vLedImageEditorCreate(IupGetDialog(multitext), config);
IupSetCallback(image_editor_dlg, "IMAGECHANGED_CB", (Icallback)imagechanged_cb);
IupSetAttribute(IupGetDialog(multitext), "IMAGE_EDITOR_DIALOG", (char*)image_editor_dlg);
}
IupConfigSetVariableInt(config, "ImageEditorDialog", "Maximized", 0);
IupConfigDialogShow(config, image_editor_dlg, "ImageEditorDialog");
vLedImageEditorNewImage(image_editor_dlg, filename);
IupPopup(image_editor_dlg, IUP_CURRENT, IUP_CURRENT);
return IUP_DEFAULT;
}
static int elem_propertiesdlg_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = !IupClassMatch(ih_item, "item") ? get_elem_tree(ih_item) : (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
Ihandle* multitext = vLedGetCurrentMultitext(elem_tree);
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
Ihandle* config = get_config(elem_tree);
Ihandle* properties_dlg = (Ihandle*)IupGetAttribute(IupGetParent(elem_tree), "PROPERTIES_DIALOG");
if (!properties_dlg)
{
properties_dlg = IupElementPropertiesDialog(IupGetDialog(elem_tree), elem);
IupSetCallback(properties_dlg, "ATTRIBCHANGED_CB", (Icallback)attribchanged_cb);
IupSetAttribute(IupGetParent(elem_tree), "PROPERTIES_DIALOG", (char*)properties_dlg);
}
else
iupLayoutPropertiesUpdate(properties_dlg, elem);
IupSetAttribute(properties_dlg, "ELEM", (char*)elem);
IupSetAttribute(properties_dlg, "MULTITEXT", (char*)multitext);
IupConfigSetVariableInt(config, "ElementPropertiesDialog", "Maximized", 0);
IupConfigDialogShow(config, properties_dlg, "ElementPropertiesDialog");
return IUP_DEFAULT;
}
static int elem_show_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
Ihandle* dialog = IupGetDialog(elem);
if (dialog)
IupShow(dialog);
else
{
if (IupClassMatch(elem, "menu"))
IupPopup(elem, IUP_MOUSEPOS, IUP_MOUSEPOS);
else
IupMessageError(IupGetDialog(elem_tree), "Will only show dialogs and independent menus.");
}
return IUP_DEFAULT;
}
static int elem_hide_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
Ihandle* dialog = IupGetDialog(elem);
if (dialog && IupGetInt(dialog, "VISIBLE"))
IupHide(dialog);
return IUP_DEFAULT;
}
static int elem_find_cb(Ihandle* ih_item)
{
Ihandle* elem_tree = !IupClassMatch(ih_item, "item") ? get_elem_tree(ih_item) : (Ihandle*)IupGetAttribute(ih_item, "ELEMENTS_TREE");
Ihandle* config = get_config(elem_tree);
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(IupGetParent(elem_tree), "FIND_ELEM_DIALOG");
int id = IupGetInt(elem_tree, "VALUE");
Ihandle *dialog;
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
if (!elem)
return IUP_DEFAULT;
if (!find_dlg)
{
find_dlg = iupLayoutFindElementDialog(elem_tree, elem);
IupSetAttribute(IupGetParent(elem_tree), "FIND_ELEM_DIALOG", (char*)find_dlg);
IupSetStrAttribute(IupGetDialogChild(find_dlg, "FIND_TEXT"), "VALUE", IupConfigGetVariableStr(config, "FindElementDialog", "FindText"));
IupSetAttribute(IupGetDialogChild(find_dlg, "TARGET"), "VALUE_HANDLE", (char*)IupGetDialogChild(find_dlg, IupConfigGetVariableStr(config, "FindElementDialog", "Target")));
}
dialog = IupGetDialog(elem);
if (!dialog)
IupSetAttribute(IupGetDialogChild(find_dlg, "FIND_NAME"), "ACTIVE", "NO");
else
IupSetAttribute(IupGetDialogChild(find_dlg, "FIND_NAME"), "ACTIVE", "YES");
IupConfigSetVariableInt(config, "FindElementDialog", "Maximized", 0);
IupConfigDialogShow(config, find_dlg, "FindElementDialog");
return IUP_DEFAULT;
}
static void show_elements_menu(Ihandle* elem_tree, int id, int x, int y)
{
Ihandle *popup_menu;
Ihandle *elem = (Ihandle *)IupTreeGetUserId(elem_tree, id);
int has_dialog = 0, is_popup_menu = 0, is_image = 0;
if (IupGetDialog(elem))
has_dialog = 1;
if (!has_dialog && IupClassMatch(elem, "menu")) /* not inside a dialog, it is a popup menu */
is_popup_menu = 1;
if (elem->iclass->nativetype == IUP_TYPEIMAGE)
is_image = 1;
IupSetInt(elem_tree, "VALUE", id);
popup_menu = IupMenu(
IupSetCallbacks(IupItem("Locate in LED\tEnter", NULL), "ACTION", elem_locate_cb, NULL), /* same as executeleaf_cb */
IupSeparator(),
IupSetCallbacks(IupItem("Collapse All", NULL), "ACTION", elem_collapse_all_cb, NULL),
IupSetCallbacks(IupItem("Expand All", NULL), "ACTION", elem_expand_all_cb, NULL),
IupSetCallbacks(IupItem("Go to Parent\tLeft", NULL), "ACTION", elem_goto_parent_cb, NULL),
IupSetCallbacks(IupItem("Go to Brother\tDown", NULL), "ACTION", elem_goto_brother_cb, NULL),
IupSeparator(),
has_dialog ? IupSetCallbacks(IupItem("Show Dialog", NULL), "ACTION", elem_show_cb, NULL) : (is_popup_menu ? IupSetCallbacks(IupItem("Popup Menu", NULL), "ACTION", elem_show_cb, NULL) : IupSetAttributes(IupItem("Show", NULL), "ACTIVE=NO")),
has_dialog ? IupSetCallbacks(IupItem("Hide Dialog", NULL), "ACTION", elem_hide_cb, NULL) : IupSetAttributes(IupItem("Hide", NULL), "ACTIVE=NO"),
IupSeparator(),
IupSetAttributes(IupSetCallbacks(IupItem("Edit Dialog Layout...", NULL), "ACTION", (Icallback)elem_layoutdlg_cb, NULL), has_dialog ? "ACTIVE=YES" : "ACTIVE=NO"),
IupSetAttributes(IupSetCallbacks(IupItem("Edit Image...", NULL), "ACTION", (Icallback)elem_imagedlg_cb, NULL), is_image ? "ACTIVE=YES" : "ACTIVE=NO"),
IupSeparator(),
IupSetCallbacks(IupItem("Element Properties...", NULL), "ACTION", elem_propertiesdlg_cb, NULL),
IupSetCallbacks(IupItem("Find Element...\tCtrl+E", "findElement"), "ACTION", elem_find_cb, NULL),
NULL);
iupAttribSet(popup_menu, "ELEMENTS_TREE", (char*)elem_tree);
IupPopup(popup_menu, x, y);
IupDestroy(popup_menu);
}
static int tree_rightclick_cb(Ihandle* elem_tree, int id)
{
IupSetInt(elem_tree, "VALUE", id);
show_elements_menu(elem_tree, id, IUP_MOUSEPOS, IUP_MOUSEPOS);
return IUP_DEFAULT;
}
static int bt_show_elem_tools_cb(Ihandle* bt)
{
Ihandle* elem_tree = get_elem_tree(bt);
int x = IupGetInt(bt, "X");
int y = IupGetInt(bt, "Y");
int h = IupGetInt2(bt, "RASTERSIZE");
int id = IupGetInt(elem_tree, "VALUE");
if (id < 0) id = 0;
y += h;
show_elements_menu(elem_tree, id, x, y);
return IUP_DEFAULT;
}
static Ihandle* buildLedMenu(Ihandle* config)
{
Ihandle *item_load, *item_unload, *item_autoload, *item_autocomplete, *item_style_config, *item_expand, *item_toggle, *item_level,
*item_folding, *item_toggle_folding, *ledMenu, *item_collapse, *item_rewrite,
*item_comment, *item_uncomment, *item_newlayout, *item_newimage;
item_autoload = IupItem("Auto Load (Open or Save)", NULL);
IupSetAttribute(item_autoload, "AUTOTOGGLE", "YES");
IupSetAttribute(item_autoload, "NAME", "ITM_LOAD");
IupSetCallback(item_autoload, "ACTION", (Icallback)item_autoload_action_cb);
if (IupConfigGetVariableIntDef(config, "IupVisualLED", "AutoLoad", 1))
IupSetAttribute(item_autoload, "VALUE", "ON");
else
IupSetAttribute(item_autoload, "VALUE", "OFF");
item_load = IupItem("Load\tF5", NULL);
IupSetCallback(item_load, "ACTION", (Icallback)item_load_action_cb);
IupSetAttribute(item_load, "IMAGE", "IUP_NavigateRefresh");
item_unload = IupItem("Unload", NULL);
IupSetCallback(item_unload, "ACTION", (Icallback)item_unload_action_cb);
item_rewrite = IupItem("Rewrite (from elements)", NULL);
IupSetAttribute(item_rewrite, "NAME", "ITM_REWRITE");
IupSetCallback(item_rewrite, "ACTION", (Icallback)item_rewrite_action_cb);
item_newlayout = IupItem("New Dialog Layout...", NULL);
IupSetCallback(item_newlayout, "ACTION", (Icallback)item_newlayout_cb);
item_newimage = IupItem("New Image...", NULL);
IupSetCallback(item_newimage, "ACTION", (Icallback)item_newimage_cb);
item_autocomplete = IupItem("Auto Completion", NULL);
IupSetAttribute(item_autocomplete, "NAME", "ITM_AUTOCOMPLETE");
IupSetCallback(item_autocomplete, "ACTION", (Icallback)item_autocomplete_action_cb);
item_style_config = IupItem("Syntax Colors...", NULL);
IupSetAttribute(item_style_config, "NAME", "ITM_STYLE");
IupSetCallback(item_style_config, "ACTION", (Icallback)item_style_config_action_cb);
item_folding = IupItem("Folding", NULL);
IupSetAttribute(item_folding, "NAME", "ITM_FOLDING");
IupSetCallback(item_folding, "ACTION", (Icallback)item_folding_action_cb);
item_toggle_folding = IupItem("Toggle Fold\tF8", NULL);
IupSetAttribute(item_toggle_folding, "NAME", "ITM_TOGGLE_FOLDING");
IupSetCallback(item_toggle_folding, "ACTION", (Icallback)item_toggle_folding_action_cb);
item_collapse = IupItem("Collapse", NULL);
IupSetAttribute(item_collapse, "NAME", "ITM_COLLAPSE");
IupSetCallback(item_collapse, "ACTION", (Icallback)item_fold_collapse_action_cb);
item_expand = IupItem("Expand", NULL);
IupSetAttribute(item_expand, "NAME", "ITM_EXPAND");
IupSetCallback(item_expand, "ACTION", (Icallback)item_fold_expand_action_cb);
item_toggle = IupItem("Toggle", NULL);
IupSetAttribute(item_toggle, "NAME", "ITM_TOGGLE");
IupSetCallback(item_toggle, "ACTION", (Icallback)item_fold_toggle_action_cb);
item_level = IupItem("by Level...", NULL);
IupSetAttribute(item_level, "NAME", "ITM_LEVEL");
IupSetCallback(item_level, "ACTION", (Icallback)item_fold_level_action_cb);
item_comment = IupItem("Comment\tCtrl+K", NULL);
IupSetCallback(item_comment, "ACTION", (Icallback)item_comment_action_cb);
item_uncomment = IupItem("Uncomment\tCtrl+Q", NULL);
IupSetCallback(item_uncomment, "ACTION", (Icallback)item_uncomment_action_cb);
ledMenu = IupMenu(
item_autoload,
item_load,
item_unload,
IupSeparator(),
item_newlayout,
item_newimage,
item_rewrite,
IupSeparator(),
item_comment,
item_uncomment,
IupSeparator(),
item_folding,
item_toggle_folding,
IupSubmenu("Fold All",
IupSetAttributes(IupMenu(
item_collapse,
item_expand,
item_toggle,
item_level,
NULL), "NAME=ITM_FOLD_ALL")),
IupSeparator(),
item_autocomplete,
item_style_config,
NULL);
IupSetCallback(ledMenu, "OPEN_CB", (Icallback)led_menu_open_cb);
return IupSubmenu("&LED", ledMenu);
}
static Ihandle* buildToolsMenu(void)
{
Ihandle *item_import_img, *item_export_img, *item_show_all_img,
*item_export_led, *item_export_open_led, *item_export_proj_led,
*item_export_lua, *item_export_open_lua, *item_export_proj_lua,
*item_export_c, *item_export_open_c, *item_export_proj_c,
*item_use_utf8, *toolsMenu, *item_imageexport_static, *item_show_stock_img;
item_import_img = IupItem("Import Images...", NULL);
IupSetAttribute(item_import_img, "NAME", "ITM_IMP_IMG");
IupSetCallback(item_import_img, "ACTION", (Icallback)item_import_img_action_cb);
item_export_img = IupItem("Export Images...", NULL);
IupSetAttribute(item_export_img, "NAME", "ITM_EXP_IMG");
IupSetCallback(item_export_img, "ACTION", (Icallback)item_export_img_cb);
item_show_all_img = IupItem("Show All Images...", NULL);
IupSetAttribute(item_show_all_img, "NAME", "ITM_SHOW_ALL_IMG");
IupSetCallback(item_show_all_img, "ACTION", (Icallback)item_show_all_img_cb);
item_show_stock_img = IupItem("Show Stock Images...", NULL);
IupSetCallback(item_show_stock_img, "ACTION", (Icallback)item_show_stock_img_cb);
item_export_led = IupItem("Export to LED...", NULL);
IupSetAttribute(item_export_led, "NAME", "ITM_EXP_LED");
IupSetCallback(item_export_led, "ACTION", (Icallback)item_export_led_action_cb);
item_export_open_led = IupItem("Export All Open to LED(s)...", NULL);
IupSetAttribute(item_export_open_led, "NAME", "ITM_EXPORT_OPEN_LED");
IupSetCallback(item_export_open_led, "ACTION", (Icallback)item_export_all_open_action_cb);
item_export_proj_led = IupItem("Export All Project to LED(s)...", NULL);
IupSetAttribute(item_export_proj_led, "NAME", "ITM_EXP_PROJ_LED");
IupSetCallback(item_export_proj_led, "ACTION", (Icallback)item_export_proj_action_cb);
item_export_lua = IupItem("Export to Lua...", NULL);
IupSetAttribute(item_export_lua, "NAME", "ITM_EXP_LUA");
IupSetCallback(item_export_lua, "ACTION", (Icallback)item_export_lua_action_cb);
item_export_open_lua = IupItem("Export All Open to Lua(s)...", NULL);
IupSetAttribute(item_export_open_lua, "NAME", "ITM_EXPORT_OPEN_LUA");
IupSetCallback(item_export_open_lua, "ACTION", (Icallback)item_export_all_open_action_cb);
item_export_proj_lua = IupItem("Export All Project to Lua(s)...", NULL);
IupSetAttribute(item_export_proj_lua, "NAME", "ITM_EXP_PROJ_LUA");
IupSetCallback(item_export_proj_lua, "ACTION", (Icallback)item_export_proj_action_cb);
item_export_c = IupItem("Export to C...", NULL);
IupSetAttribute(item_export_c, "NAME", "ITM_EXP_C");
IupSetCallback(item_export_c, "ACTION", (Icallback)item_export_c_action_cb);
item_export_open_c = IupItem("Export All Open to C(s)...", NULL);
IupSetAttribute(item_export_open_c, "NAME", "ITM_EXPORT_OPEN_C");
IupSetCallback(item_export_open_c, "ACTION", (Icallback)item_export_all_open_action_cb);
item_export_proj_c = IupItem("Export All Project To C(s)...", NULL);
IupSetAttribute(item_export_proj_c, "NAME", "ITM_EXP_PROJ_C");
IupSetCallback(item_export_proj_c, "ACTION", (Icallback)item_export_proj_action_cb);
item_use_utf8 = IupItem("Use UTF-8", NULL);
IupSetAttribute(item_use_utf8, "AUTOTOGGLE", "Yes");
IupSetCallback(item_use_utf8, "ACTION", (Icallback)item_use_utf_8_action_cb);
if (IupGetInt(NULL, "UTF8MODE"))
IupSetAttribute(item_use_utf8, "VALUE", "ON");
else
IupSetAttribute(item_use_utf8, "VALUE", "OFF");
item_imageexport_static = IupItem("Image Export Use \"static\"", NULL);
IupSetAttribute(item_imageexport_static, "AUTOTOGGLE", "Yes");
IupSetCallback(item_imageexport_static, "ACTION", (Icallback)item_imageexport_static_action_cb);
if (IupGetInt(NULL, "IMAGEEXPORT_STATIC"))
IupSetAttribute(item_imageexport_static, "VALUE", "ON");
else
IupSetAttribute(item_imageexport_static, "VALUE", "OFF");
toolsMenu = IupMenu(
IupSetCallbacks(IupItem("Globals...", NULL), "ACTION", globalsdlg_cb, NULL),
IupSetCallbacks(IupItem("Class Info...", NULL), "ACTION", classinfo_cb, NULL),
IupSeparator(),
item_import_img,
item_export_img,
item_show_all_img,
item_show_stock_img,
IupSeparator(),
item_export_led,
item_export_open_led,
item_export_proj_led,
IupSeparator(),
item_export_lua,
item_export_open_lua,
item_export_proj_lua,
IupSeparator(),
item_export_c,
item_export_open_c,
item_export_proj_c,
IupSeparator(),
item_imageexport_static,
item_use_utf8,
NULL);
IupSetCallback(toolsMenu, "OPEN_CB", (Icallback)tools_menu_open_cb);
return IupSubmenu("&Tools", toolsMenu);
}
static Ihandle* buildElemToolbar(void)
{
Ihandle* elem_but_box;
Ihandle* btn_tools, *bt_prop, *bt_find, *bt_locate, *bt_layout, *bt_image;
btn_tools = IupButton(NULL, NULL);
IupSetAttribute(btn_tools, "IMAGE", "IUP_ToolsSettings");
IupSetAttribute(btn_tools, "FLAT", "Yes");
IupSetCallback(btn_tools, "ACTION", (Icallback)bt_show_elem_tools_cb);
IupSetAttribute(btn_tools, "TIP", "Elements Tools\n(same as right click the tree)");
IupSetAttribute(btn_tools, "CANFOCUS", "No");
bt_locate = IupButton(NULL, NULL);
IupSetAttribute(bt_locate, "IMAGE", "IupVLedGotoCmd");
IupSetAttribute(bt_locate, "FLAT", "Yes");
IupSetCallback(bt_locate, "ACTION", (Icallback)elem_locate_cb);
IupSetAttribute(bt_locate, "TIP", "Locate in LED");
IupSetAttribute(bt_locate, "CANFOCUS", "No");
bt_layout = IupButton(NULL, NULL);
IupSetAttribute(bt_layout, "IMAGE", "IupVLedLayout");
IupSetAttribute(bt_layout, "NAME", "ELEM_LAYOUT_BUTTON");
IupSetAttribute(bt_layout, "FLAT", "Yes");
IupSetCallback(bt_layout, "ACTION", (Icallback)elem_layoutdlg_cb);
IupSetAttribute(bt_layout, "TIP", "Edit Dialog Layout...");
IupSetAttribute(bt_layout, "CANFOCUS", "No");
bt_image = IupButton(NULL, NULL);
IupSetAttribute(bt_image, "IMAGE", "IupVLedImageEditor");
IupSetAttribute(bt_image, "FLAT", "Yes");
IupSetAttribute(bt_image, "NAME", "ELEM_IMAGE_BUTTON");
IupSetCallback(bt_image, "ACTION", (Icallback)elem_imagedlg_cb);
IupSetAttribute(bt_image, "TIP", "Edit Image...");
IupSetAttribute(bt_image, "CANFOCUS", "No");
bt_prop = IupButton(NULL, NULL);
IupSetAttribute(bt_prop, "IMAGE", "IUP_FileProperties");
IupSetAttribute(bt_prop, "FLAT", "Yes");
IupSetCallback(bt_prop, "ACTION", (Icallback)elem_propertiesdlg_cb);
IupSetAttribute(bt_prop, "TIP", "Element Properties...");
IupSetAttribute(bt_prop, "CANFOCUS", "No");
bt_find = IupButton(NULL, NULL);
IupSetAttribute(bt_find, "IMAGE", "IUP_EditFind");
IupSetAttribute(bt_find, "FLAT", "Yes");
IupSetCallback(bt_find, "ACTION", (Icallback)elem_find_cb);
IupSetAttribute(bt_find, "TIP", "Find Element...\tCtrl+E");
IupSetAttribute(bt_find, "CANFOCUS", "No");
elem_but_box = IupVbox(
btn_tools,
IupSetAttributes(IupSpace(), "RASTERSIZE=0x8"),
IupSetAttributes(IupLabel(NULL), "SEPARATOR=HORIZONTAL"),
IupSetAttributes(IupSpace(), "RASTERSIZE=0x8"),
bt_locate,
bt_layout,
bt_image,
bt_prop,
bt_find,
NULL
);
return elem_but_box;
}
static void addToolbarButtons(Ihandle* toolbar)
{
Ihandle* bt;
IupAppend(toolbar, IupSetAttributes(IupLabel(NULL), "SEPARATOR=VERTICAL"));
bt = IupButton(NULL, NULL);
IupSetAttribute(bt, "IMAGE", "IUP_NavigateRefresh");
IupSetAttribute(bt, "FLAT", "Yes");
IupSetCallback(bt, "ACTION", (Icallback)item_load_action_cb);
IupSetAttribute(bt, "TIP", "Re-load the LED and build its elements (F5)");
IupSetAttribute(bt, "CANFOCUS", "No");
IupAppend(toolbar, bt);
bt = IupButton(NULL, NULL);
IupSetAttribute(bt, "IMAGE", "IupVLedNewLayout");
IupSetAttribute(bt, "FLAT", "Yes");
IupSetCallback(bt, "ACTION", (Icallback)item_newlayout_cb);
IupSetAttribute(bt, "TIP", "New Dialog Layout\n(insert a new dialog at caret and starts editing its layout)");
IupSetAttribute(bt, "CANFOCUS", "No");
IupAppend(toolbar, bt);
bt = IupButton(NULL, NULL);
IupSetAttribute(bt, "IMAGE", "IupVLedNewImage");
IupSetAttribute(bt, "FLAT", "Yes");
IupSetCallback(bt, "ACTION", (Icallback)item_newimage_cb);
IupSetAttribute(bt, "TIP", "Creates a new image");
IupSetAttribute(bt, "CANFOCUS", "No");
IupAppend(toolbar, bt);
IupAppend(toolbar, IupSetAttributes(IupLabel(NULL), "SEPARATOR=VERTICAL"));
bt = IupButton("#", NULL);
IupSetAttribute(bt, "FLAT", "Yes");
IupSetAttribute(bt, "FONTSTYLE", "Bold");
IupSetAttribute(bt, "PADDING", "4x0");
IupSetCallback(bt, "ACTION", (Icallback)item_comment_action_cb);
IupSetAttribute(bt, "TIP", "Comment one or more lines (Ctrl+K)");
IupSetInt(bt, "FONTSIZE", IupGetInt(bt, "FONTSIZE") + 2);
IupSetAttribute(bt, "CANFOCUS", "No");
IupAppend(toolbar, bt);
bt = IupButton("#", NULL);
IupSetAttribute(bt, "FLAT", "Yes");
IupSetAttribute(bt, "FGCOLOR", "128 80 80");
IupSetAttribute(bt, "PADDING", "4x0");
IupSetCallback(bt, "ACTION", (Icallback)item_uncomment_action_cb);
IupSetAttribute(bt, "TIP", "Uncomment one or more lines (Ctrl+Q)");
IupSetInt(bt, "FONTSIZE", IupGetInt(bt, "FONTSIZE") + 2);
IupSetAttribute(bt, "CANFOCUS", "No");
IupAppend(toolbar, bt);
}
static int scidlg_exit_cb(Ihandle* main_dialog)
{
int i;
Ihandle *dlg;
int count = iupDlgListVisibleCount();
/* hide all other dialogs, some non application dialogs may be open */
for (dlg = iupDlgListFirst(), i = 0; dlg && i < count; dlg = iupDlgListNext())
{
if (dlg != main_dialog && (dlg->handle && IupGetInt(dlg, "VISIBLE")))
{
IupHide(dlg);
i++;
}
}
return IUP_DEFAULT;
}
/**********************************************************************/
int main(int argc, char **argv)
{
Ihandle *main_dialog, *menu, *config;
Ihandle *ledMenu, *toolsMenu, *elem_but_box;
Ihandle *panelTabs, *multitextTabs;
Ihandle *elem_tree_box, *elementsFrame;
Ihandle* extra_dlg, *toolbar;
Icallback oldTabChange_cb;
int i;
IupOpen(&argc, &argv);
IupImageLibOpen();
IupScintillaOpen();
IupControlsOpen();
IupImOpen();
#ifndef USE_NO_OPENGL
IupGLCanvasOpen();
IupGLControlsOpen();
#endif
#ifndef USE_NO_WEB
IupWebBrowserOpen();
#endif
#ifndef USE_NO_PLOT
IupPlotOpen();
#endif
#ifdef _DEBUG
IupSetGlobal("GLOBALLAYOUTDLGKEY", "Yes");
#endif
vLedLoadImages();
config = IupConfig();
IupSetAttribute(config, "APP_NAME", "iupvled");
IupConfigLoad(config);
IupSetGlobal("UTF8MODE", IupConfigGetVariableStr(config, "IupVisualLED", "UTF-8"));
IupSetGlobal("IMAGEEXPORT_STATIC", IupConfigGetVariableStr(config, "IupVisualLED", "ImageExportStatic"));
#ifdef USE_UTF8_VC
if (IupGetInt(NULL, "UTF8MODE"))
{
IupSetGlobal("UTF8MODE_FILE", "Yes");
setlocale(LC_ALL, ".UTF8");
}
#endif
main_dialog = IupScintillaDlg();
IupSetAttributeHandle(NULL, "PARENTDIALOG", main_dialog);
ledMenu = buildLedMenu(config);
menu = IupGetAttributeHandle(main_dialog, "MENU");
IupInsert(menu, IupGetChild(menu, IupGetChildCount(menu) - 1), ledMenu);
toolsMenu = buildToolsMenu();
IupInsert(menu, IupGetChild(menu, IupGetChildCount(menu) - 1), toolsMenu);
panelTabs = IupGetDialogChild(main_dialog, "PANEL_TABS");
multitextTabs = IupGetDialogChild(main_dialog, "MULTITEXT_TABS");
IupSetCallback(main_dialog, "NEWFILENAME_CB", (Icallback)scidlg_newfilename_cb);
IupSetCallback(main_dialog, "LOADFILE_CB", (Icallback)scidlg_loadfile_cb);
IupSetCallback(main_dialog, "SAVEFILE_CB", (Icallback)scidlg_savefile_cb);
IupSetCallback(main_dialog, "NEWTEXT_CB", (Icallback)scidlg_newtext_cb);
IupSetCallback(main_dialog, "CLOSETEXT_CB", (Icallback)scidlg_closetext_cb);
IupSetCallback(main_dialog, "CONFIGSAVE_CB", (Icallback)scidlg_configsave_cb);
IupSetCallback(main_dialog, "CONFIGLOAD_CB", (Icallback)scidlg_configload_cb);
IupSetCallback(main_dialog, "MARKERCHANGED_CB", (Icallback)scidlg_markerchanged_cb);
IupSetCallback(main_dialog, "EXIT_CB", (Icallback)scidlg_exit_cb);
IupSetCallback(main_dialog, "K_cE", (Icallback)elem_find_cb);
IupSetCallback(main_dialog, "K_F5", (Icallback)item_load_action_cb);
IupSetCallback(main_dialog, "K_cK", (Icallback)item_comment_action_cb);
IupSetCallback(main_dialog, "K_cQ", (Icallback)item_uncomment_action_cb);
/* Additional toolbar buttons */
toolbar = IupGetDialogChild(main_dialog, "TOOLBAR");
addToolbarButtons(toolbar);
/* Elements trees */
elem_tree_box = IupZbox(NULL);
IupSetAttribute(elem_tree_box, "NAME", "ELEM_TREE_BOX");
elem_but_box = buildElemToolbar();
IupSetAttribute(elem_but_box, "ACTIVE", "NO");
elementsFrame = IupFrame(IupHbox(elem_tree_box, elem_but_box, NULL));
IupSetAttribute(elementsFrame, "MARGIN", "4x4");
IupSetAttribute(elementsFrame, "GAP", "4");
IupSetAttribute(elementsFrame, "TITLE", "Elements:");
IupSetAttribute(elementsFrame, "TABTITLE", "Elements");
IupAppend(panelTabs, elementsFrame);
IupSetAttribute(panelTabs, "VALUE_HANDLE", (char*)elementsFrame);
/* IupScintillaDlg configuration */
IupSetAttribute(main_dialog, "SUBTITLE", "IupVisualLED");
IupSetAttribute(main_dialog, "PROJECT_EXT", "vled");
IupSetAttribute(main_dialog, "EXTRAFILTERS", "Led Files|*.led|");
IupSetAttribute(main_dialog, "DEFAULT_EXT", "led");
IupSetAttributeHandle(main_dialog, "CONFIG", config);
IupSetHandle("VLED_MAIN", main_dialog);
oldTabChange_cb = IupGetCallback(multitextTabs, "TABCHANGE_CB");
IupSetCallback(multitextTabs, "OLDTABCHANGE_CB", oldTabChange_cb);
IupSetCallback(multitextTabs, "TABCHANGE_CB", (Icallback)tabChange_cb);
menu = IupGetAttributeHandle(main_dialog, "MENU");
IupAppend(menu, IupSubmenu("&Help", IupMenu(
IupSetCallbacks(IupItem("&IUP...", NULL), "ACTION", (Icallback)item_iup_action_cb, NULL),
IupSetCallbacks(IupItem("&Help...", NULL), "ACTION", (Icallback)item_help_action_cb, NULL),
IupSetCallbacks(IupItem("&About...", NULL), "ACTION", (Icallback)item_about_action_cb, NULL),
NULL)));
/* show the dialog at the last position, with the last size */
IupConfigDialogShow(config, main_dialog, "IupVisualLED");
/* open a file from the command line (allow file association in Windows) */
for (i = 1; i < argc; i++) /* arg0 is executable name */
{
const char* filename = argv[i];
if (strstr(filename, ".vled"))
IupSetStrAttribute(main_dialog, "OPENPROJECT", filename);
else
IupSetStrAttribute(main_dialog, "OPENFILE", filename);
}
/* Call NEW_TEXT_CB because the first tab was already created */
scidlg_newtext_cb(main_dialog, vLedGetCurrentMultitext(main_dialog));
IupRefresh(main_dialog);
IupMainLoop();
extra_dlg = (Ihandle*)IupGetAttribute(elem_tree_box, "FIND_ELEM_DIALOG");
if (iupObjectCheck(extra_dlg))
IupDestroy(extra_dlg);
extra_dlg = (Ihandle*)IupGetAttribute(elem_tree_box, "PROPERTIES_DIALOG");
if (iupObjectCheck(extra_dlg))
IupDestroy(extra_dlg);
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "IMAGE_EDITOR_DIALOG");
if (iupObjectCheck(extra_dlg))
IupDestroy(extra_dlg);
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "GLOBALS_DIALOG");
if (iupObjectCheck(extra_dlg))
IupDestroy(extra_dlg);
extra_dlg = (Ihandle*)IupGetAttribute(main_dialog, "CLASSINFO_DIALOG");
if (iupObjectCheck(extra_dlg))
IupDestroy(extra_dlg);
IupDestroy(main_dialog);
IupDestroy(config);
IupClose();
return EXIT_SUCCESS;
}