iup-stack/iup/srcscintilla/iup_scintilladlg.c

5578 lines
174 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "iup.h"
#include "iupcbs.h"
#include "iup_scintilla.h"
#include "iup_config.h"
#include "iup_linefile.h"
#include "iup_object.h"
#include "iup_attrib.h"
#include "iup_str.h"
#include "iup_strmessage.h"
#include "iup_register.h"
#include "iup_childtree.h"
#include "iup_predialogs.h"
#define LINENUMBER_MARGIN "50"
#define BOOKMARK_MARGIN "20"
#define WINDOWMENU_MAX 10
/********************************** Utilities *****************************************/
static void copyFilenameToClipboard(const char *filename)
{
Ihandle *clipboard = IupClipboard();
IupSetAttribute(clipboard, "TEXT", NULL); /* clear clipboard first */
IupSetAttribute(clipboard, "TEXT", filename);
IupDestroy(clipboard);
}
static void saveMarkers(Ihandle* config, Ihandle* multitext)
{
char* m_filename = IupGetAttribute(multitext, "FILENAME");
char filename[10240], line_str[30];
const char* value;
int i, lin, count;
IFnn cb;
count = IupConfigGetVariableInt(config, "SciBookmarks", "Count");
/* clear all bookmarks for this filename and compact list */
for (i = 1; i <= count;)
{
value = IupConfigGetVariableStrId(config, "SciBookmarks", "FileLine", i);
iupStrToStrStr(value, filename, line_str, '#');
if (iupStrEqual(filename, m_filename))
{
IupConfigSetVariableStrId(config, "SciBookmarks", "FileLine", i, IupConfigGetVariableStrId(config, "SciBookmarks", "FileLine", count));
IupConfigSetVariableStrId(config, "SciBookmarks", "FileLine", count, NULL);
count--;
}
else
i++;
}
/* add current bookmarks at the end */
lin = 0;
while (lin >= 0)
{
IupSetAttributeId(multitext, "MARKERNEXT", lin, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin >= 0)
{
count++;
sprintf(filename, "%s#%d", m_filename, lin + 1); /* use the same origin for line numbers */
IupConfigSetVariableStrId(config, "SciBookmarks", "FileLine", count, filename);
lin++;
}
}
IupConfigSetVariableInt(config, "SciBookmarks", "Count", count);
/* make sure some older bookmarks are not saved in the configuration file (at least 10) */
for (i = count + 1; i <= count + 1 + 10; i++)
IupConfigSetVariableStrId(config, "SciBookmarks", "FileLine", i, NULL);
cb = (IFnn)IupGetCallback(IupGetDialog(multitext), "SAVEMARKERS_CB");
if (cb)
cb(IupGetDialog(multitext), multitext);
}
static void saveAllMarkers(Ihandle* ih, Ihandle* config)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
saveMarkers(config, multitext);
}
static void restoreMarkers(Ihandle* config, Ihandle* multitext)
{
char* m_filename = IupGetAttribute(multitext, "FILENAME");
char filename[10240], line_str[30];
const char* value;
int i, line, count;
IFnn cb;
IupSetInt(multitext, "MARKERDELETEALL", 0);
count = IupConfigGetVariableInt(config, "SciBookmarks", "Count");
/* clear all bookmarks for this filename and compact list */
for (i = 1; i <= count; i++)
{
value = IupConfigGetVariableStrId(config, "SciBookmarks", "FileLine", i);
iupStrToStrStr(value, filename, line_str, '#');
if (iupStrEqual(filename, m_filename))
{
unsigned int markerMask;
int has_bookmark;
iupStrToInt(line_str, &line);
markerMask = (unsigned int)IupGetIntId(multitext, "MARKERGET", line);
has_bookmark = markerMask & 0x0001; /* 0001 - marker=0 */
if (!has_bookmark)
IupSetIntId(multitext, "MARKERADD", line - 1, 0);
}
}
cb = (IFnn)IupGetCallback(IupGetDialog(multitext), "RESTOREMARKERS_CB");
if (cb)
cb(IupGetDialog(multitext), multitext);
}
static void addBookmark(Ihandle* multitext, int lin)
{
IupSetIntId(multitext, "MARKERADD", lin, 0); /* marker=0 */
}
static void removeBookmark(Ihandle* multitext, int lin)
{
IupSetIntId(multitext, "MARKERDELETE", lin, 0); /* marker=0 */
}
static void removeAllBookmark(Ihandle* multitext)
{
IupSetInt(multitext, "MARKERDELETEALL", 0); /* marker=0 */
}
static void toggleMarker(Ihandle* multitext, int lin, int margin)
{
Ihandle* ih = IupGetDialog(multitext);
IFnnii cb;
/* bookmarks */
if (margin == 1)
{
unsigned int markerMask = (unsigned int)IupGetIntId(multitext, "MARKERGET", lin);
int has_bookmark = markerMask & 0x0001; /* 0001 - marker=0 */
if (has_bookmark)
removeBookmark(multitext, lin);
else
addBookmark(multitext, lin);
}
cb = (IFnnii)IupGetCallback(ih, "MARKERCHANGED_CB");
if (cb)
cb(ih, multitext, lin, margin);
}
static void copyMarkedLines(Ihandle *multitext)
{
int size = IupGetInt(multitext, "COUNT");
char *buffer = (char *)malloc(size);
char *text;
int lin = 0;
buffer[0] = 0;
while (lin >= 0)
{
IupSetAttributeId(multitext, "MARKERNEXT", lin, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin >= 0)
{
text = IupGetAttributeId(multitext, "LINE", lin);
strcat(buffer, text); size -= (int)strlen(text);
lin++;
}
}
if (strlen(buffer) > 0)
{
Ihandle *clipboard = IupClipboard();
IupSetAttribute(clipboard, "TEXT", NULL); /* clear clipboard first */
IupSetAttribute(clipboard, "TEXT", buffer);
IupDestroy(clipboard);
}
free(buffer);
}
static void cutMarkedLines(Ihandle *multitext)
{
int size = IupGetInt(multitext, "COUNT");
char *buffer = (char *)malloc(size);
char *text;
int lin = 0, pos, len;
buffer[0] = 0;
while (lin >= 0 && size)
{
IupSetAttributeId(multitext, "MARKERNEXT", lin, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin >= 0)
{
text = IupGetAttributeId(multitext, "LINE", lin);
len = (int)strlen(text);
IupTextConvertLinColToPos(multitext, lin, 0, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, len);
strcat(buffer, text); size -= len;
removeBookmark(multitext, lin);
lin--;
}
}
if (strlen(buffer) > 0)
{
Ihandle *clipboard = IupClipboard();
IupSetAttribute(clipboard, "TEXT", NULL); /* clear clipboard first */
IupSetAttribute(clipboard, "TEXT", buffer);
IupDestroy(clipboard);
}
free(buffer);
}
static void pasteToMarkedLines(Ihandle *multitext)
{
char *text;
int lin = 0, pos, len;
Ihandle *clipboard;
while (lin >= 0)
{
IupSetAttributeId(multitext, "MARKERNEXT", lin, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin >= 0)
{
text = IupGetAttributeId(multitext, "LINE", lin);
len = (int)strlen(text);
IupTextConvertLinColToPos(multitext, lin, 0, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, len);
removeBookmark(multitext, lin);
clipboard = IupClipboard();
IupSetAttributeId(multitext, "INSERT", pos, IupGetAttribute(clipboard, "TEXT"));
IupDestroy(clipboard);
lin--;
}
}
}
static void invertMarkedLines(Ihandle *multitext)
{
int lin;
for (lin = 0; lin < IupGetInt(multitext, "LINECOUNT"); lin++)
{
toggleMarker(multitext, lin, 1);
}
}
static void removeMarkedLines(Ihandle *multitext)
{
char *text;
int lin = 0, pos, len;
while (lin >= 0)
{
IupSetAttributeId(multitext, "MARKERNEXT", lin, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin >= 0)
{
text = IupGetAttributeId(multitext, "LINE", lin);
len = (int)strlen(text);
IupTextConvertLinColToPos(multitext, lin, 0, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, len);
removeBookmark(multitext, lin);
lin--;
}
}
}
static void changeTabsToSpaces(Ihandle *multitext)
{
char *text = IupGetAttribute(multitext, "VALUE");
int count = IupGetInt(multitext, "COUNT");
int tabSize = IupGetInt(multitext, "TABSIZE");
int lin, col, i, j;
if (tabSize == 0)
return;
for (i = count - 1; i >= 0; i--)
{
int spacesToNextTab;
char c = text[i];
if (c != '\t')
continue;
IupSetStrf(multitext, "DELETERANGE", "%d,%d", i, 1);
IupTextConvertPosToLinCol(multitext, i, &lin, &col);
spacesToNextTab = tabSize - (col + 1) % tabSize + 1;
for (j = 0; j < spacesToNextTab; j++)
IupSetAttributeId(multitext, "INSERT", i + j, " ");
}
}
static void changeSpacesToTabs(Ihandle *multitext)
{
char *text = IupGetAttribute(multitext, "VALUE");
int count = IupGetInt(multitext, "COUNT");
int tabSize = IupGetInt(multitext, "TABSIZE");
int lin, col, i;
if (tabSize == 0)
return;
for (i = count - 1; i >= 0; i--)
{
int nSpaces, tabStop;
char c = text[i];
IupTextConvertPosToLinCol(multitext, i, &lin, &col);
tabStop = (col + 1) % tabSize == tabSize - 1 ? 1 : 0;
if (!tabStop || c != ' ')
continue;
IupSetStrf(multitext, "DELETERANGE", "%d,%d", i + 1, 1);
IupSetAttributeId(multitext, "INSERT", i + 1, "\t");
nSpaces = 0;
while (text[i - nSpaces] == ' ' && nSpaces < tabSize - 1)
nSpaces++;
if (nSpaces == 0)
continue;
i -= nSpaces;
IupSetStrf(multitext, "DELETERANGE", "%d,%d", i + 1, nSpaces);
}
}
static void changeLeadingSpacesToTabs(Ihandle *multitext)
{
int lineCount = IupGetInt(multitext, "LINECOUNT");
int tabSize = IupGetInt(multitext, "TABSIZE");
int pos, i, j;
if (tabSize == 0)
return;
for (i = 0; i < lineCount; i++)
{
int tabCount = 0;
int spaceCount = 0;
char *text = IupGetAttributeId(multitext, "LINE", i);
int len = (int)strspn(text, " \t");
if (len == 0)
continue;
for (j = 0; j < len; j++)
{
if (text[j] == '\t')
{
tabCount++;
spaceCount = 0;
}
else
spaceCount++;
if (spaceCount == tabSize)
{
tabCount++;
spaceCount = 0;
}
}
IupTextConvertLinColToPos(multitext, i, 0, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, len);
for (j = 0; j < spaceCount; j++)
IupSetAttributeId(multitext, "INSERT", pos, " ");
for (j = 0; j < tabCount; j++)
IupSetAttributeId(multitext, "INSERT", pos, "\t");
}
}
static void removeLeadingSpaces(Ihandle *multitext)
{
int lineCount = IupGetInt(multitext, "LINECOUNT");
int pos, i;
for (i = 0; i < lineCount; i++)
{
char *text = IupGetAttributeId(multitext, "LINE", i);
int len = (int)strspn(text, " \t");
if (len == 0)
continue;
IupTextConvertLinColToPos(multitext, i, 0, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, len);
}
}
static void removeTrailingSpaces(Ihandle *multitext)
{
int lineCount = IupGetInt(multitext, "LINECOUNT");
int pos, i, j;
for (i = 0; i < lineCount; i++)
{
int count = 0;
char *text = IupGetAttributeId(multitext, "LINE", i);
int len = (int)strlen(text);
if (len == 0)
continue;
if (text[len - 1] == '\n' || text[len - 1] == '\r')
{
len--;
if (text[len - 1] == '\r')
len--;
}
for (j = len - 1; j >= 0; j--)
{
if (text[j] != ' ' && text[j] != '\t')
break;
count++;
}
if (count == 0)
continue;
IupTextConvertLinColToPos(multitext, i, len - count, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, count);
}
}
static void changeEolToSpace(Ihandle *multitext)
{
int lineCount = IupGetInt(multitext, "LINECOUNT");
int i;
for (i = lineCount-1; i >= 0; i--)
{
int pos, count;
char *text = IupGetAttributeId(multitext, "LINE", i);
int len = (int)strlen(text);
if (len == 0)
continue;
count = 0;
if (text[len - 1] == '\n' || text[len - 1] == '\r')
{
len--;
count++;
if (text[len - 1] == '\r')
{
len--;
count++;
}
}
if (count == 0)
continue;
IupTextConvertLinColToPos(multitext, i, len, &pos);
IupSetStrf(multitext, "DELETERANGE", "%d,%d", pos, count);
IupSetAttributeId(multitext, "INSERT", pos, " ");
}
}
static const char* strFileTitle(const char *filename)
{
/* Start at the last character */
int len = (int)strlen(filename);
int offset = len - 1;
while (offset != 0)
{
if (filename[offset] == '\\' || filename[offset] == '/')
{
offset++;
break;
}
offset--;
}
return filename + offset;
}
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 nul terminator */
str[size] = 0;
fclose(file);
return str;
}
static int writeFile(const char* filename, const char* str, int count)
{
FILE* file = fopen(filename, "wb");
if (!file)
return 0;
fwrite(str, 1, count, file);
fclose(file);
return 1;
}
static Ihandle* iScintillaDlgGetConfig(Ihandle* ih)
{
return (Ihandle*)iupAttribGetInherit(ih, "_IUP_CONFIG");
}
static Ihandle* iScintillaDlgGetProjectConfig(Ihandle* ih)
{
return (Ihandle*)iupAttribGetInherit(ih, "_IUP_PROJECT_CONFIG");
}
static char* getProjectRelativeFilename(const char *app_filename, const char* filename)
{
char *appdelim, *filedelim, *lastappdelim = NULL;
const char *lastdelim;
int i = 0;
char rel_filename[10240], app_folder[1024], folder[1024];
/* filename here has an absolute path, must find its relative path to app_filename */
lastdelim = filename;
appdelim = strpbrk(app_filename, "\\/");
filedelim = strpbrk(filename, "\\/");
/* compare each folder from start */
memset(app_folder, '\0', sizeof(app_folder));
if (appdelim)
strncpy(app_folder, app_filename, appdelim - app_filename);
memset(folder, '\0', sizeof(folder));
if (filedelim)
strncpy(folder, filename, filedelim - filename);
if (!iupStrEqual(app_folder, folder))
return iupStrDup(filename);
while (filedelim != NULL || appdelim != NULL)
{
lastdelim = filedelim;
lastappdelim = appdelim;
appdelim = strpbrk(appdelim+1, "\\/");
filedelim = strpbrk(filedelim+1, "\\/");
memset(app_folder, '\0', sizeof(app_folder));
if (appdelim)
strncpy(app_folder, app_filename, appdelim - app_filename);
memset(folder, '\0', sizeof(folder));
if (filedelim)
strncpy(folder, filename, filedelim - filename);
if (!iupStrEqual(app_folder, folder))
break;
}
/* up to here there are folders that match */
/* count the remaining folders in project folder */
while (lastappdelim != NULL)
{
lastappdelim = strpbrk(lastappdelim+1, "\\/");
i++;
}
i--;
strcpy(rel_filename, "");
/* add that count of relative folders */
while (i > 0)
{
strcat(rel_filename, "../");
i--;
}
/* add the remaining filename folders and everything else */
strcat(rel_filename, lastdelim+1);
return iupStrDup(rel_filename);
}
static char* setProjectRelativeFilename(const char* app_filename, const char* filename)
{
char *project_path = iupStrFileGetPath(app_filename);
const char *filedelim, *lastfiledelim;
char folder[1024], full_filename[10240];
int i = 0, n, len;
if (*(filename + 1) == ':') /* filename here should be a relative path, if it has a driver separator, it is not */
return iupStrDup(filename);
len = (int)strlen(project_path);
*(project_path + len - 1) = '\0'; /* removes the last separator */
/* search for folders */
lastfiledelim = filename;
filedelim = strpbrk(filename, "\\/");
while (filedelim)
{
memset(folder, '\0', sizeof(folder));
strncpy(folder, filename, filedelim - lastfiledelim);
if (!iupStrEqual(folder, "..")) /* a relative path usually starts with .. */
break;
i++; /* count the number of .. */
lastfiledelim = filedelim+1;
filedelim = strpbrk(filedelim+1, "\\/");
}
for (n = 0; n < i; n++) /* for all .. remove the same number from project_path */
{
char *delim = strpbrk(project_path, "\\/");
char *lastdelim = NULL;
while (delim)
{
lastdelim = delim;
delim = strpbrk(delim + 1, "\\/");
}
if (lastdelim)
*lastdelim = '\0';
}
strcpy(full_filename, project_path);
strcat(full_filename, "/");
strcat(full_filename, lastfiledelim);
free(project_path);
return iupStrDup(full_filename);
}
static void saveProjectOpenFilesList(Ihandle *ih, Ihandle *projectConfig)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
char* filename;
int i;
int count = IupConfigGetVariableInt(projectConfig, "ProjectOpenFiles", "Count");
const char *app_filename = IupGetAttribute(projectConfig, "APP_FILENAME");
/* clear everything before saving */
for (i = 1; i <= count; i++)
IupConfigSetVariableStrId(projectConfig, "ProjectOpenFiles", "File", i, NULL);
IupConfigSetVariableStr(projectConfig, "ProjectOpenFiles", "Count", NULL);
i = 1;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
filename = IupGetAttribute(multitext, "FILENAME");
if (!filename)
continue;
if (app_filename)
filename = getProjectRelativeFilename(app_filename, filename);
IupConfigSetVariableStrId(projectConfig, "ProjectOpenFiles", "File", i, filename);
if (app_filename)
free(filename);
i++;
}
IupConfigSetVariableInt(projectConfig, "ProjectOpenFiles", "Count", i - 1);
}
static void saveProjectFilesList(Ihandle *projectTree, Ihandle *projectConfig)
{
int count = IupConfigGetVariableInt(projectConfig, "PojectFiles", "Count");
const char *app_filename = IupGetAttribute(projectConfig, "APP_FILENAME");
char *filename;
int i;
/* clear everything before saving */
for (i = 1; i <= count; i++)
IupConfigSetVariableStrId(projectConfig, "ProjectFiles", "File", i, NULL);
IupConfigSetVariableStr(projectConfig, "ProjectFiles", "Count", NULL);
i = 1;
filename = IupTreeGetUserId(projectTree, i);
while (filename != NULL)
{
if (app_filename)
filename = getProjectRelativeFilename(app_filename, filename);
IupConfigSetVariableStrId(projectConfig, "ProjectFiles", "File", i, filename);
if (app_filename)
free(filename);
i++;
filename = IupTreeGetUserId(projectTree, i);
}
count = i - 1;
IupConfigSetVariableInt(projectConfig, "ProjectFiles", "Count", count);
}
static void addFileToProjectTree(Ihandle *projectTree, const char *new_filename)
{
Ihandle* ih = IupGetDialog(projectTree);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
int count = IupGetIntId(projectTree, "CHILDCOUNT", 0);
const char *newTitle = strFileTitle(new_filename);
int currentId = IupGetInt(projectTree, "VALUE");
if (currentId == 0)
IupSetStrAttributeId(projectTree, "ADDLEAF", 0, newTitle);
else if (currentId == -1)
IupSetStrAttributeId(projectTree, "ADDLEAF", count + 1, newTitle);
else
IupSetStrAttributeId(projectTree, "ADDLEAF", currentId, newTitle);
IupTreeSetUserId(projectTree, IupGetInt(projectTree, "LASTADDNODE"), iupStrDup(new_filename));
saveProjectFilesList(projectTree, projectConfig);
}
static void new_file(Ihandle* ih_item);
static int iScintillaDlgCloseMultitext(Ihandle* multitext, int check);
static void removeFileFromProject(Ihandle *projectConfig, Ihandle *projectTree, int id)
{
char *filename = IupTreeGetUserId(projectTree, id);
Ihandle* tabs = IupGetDialogChild(projectTree, "MULTITEXT_TABS");
Ihandle *multitext;
char* m_filename;
IupSetAttributeId(projectTree, "DELNODE", id, "SELECTED");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
m_filename = IupGetAttribute(multitext, "FILENAME");
if (iupStrEqual(m_filename, filename))
{
iScintillaDlgCloseMultitext(multitext, 1);
break;
}
}
if (IupGetChildCount(tabs) == 0)
new_file(tabs); /* always keep at least one multitext */
IupSetAttribute(projectConfig, "MODIFIED", "YES");
saveProjectFilesList(projectTree, projectConfig);
free(filename);
}
static void updateTitle(Ihandle* multitext, int is_modified)
{
Ihandle* ih = IupGetDialog(multitext);
Ihandle* tabs = IupGetParent(multitext);
int pos = IupGetChildPos(tabs, multitext);
char* subtitle = IupGetAttribute(ih, "SUBTITLE");
const char* modified_sign = "", *title;
char* filename = IupGetAttribute(multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(multitext, "NEW_FILENAME");
if (is_modified)
modified_sign = "*";
title = strFileTitle(filename);
IupSetfAttribute(ih, "TITLE", "%s%s - %s", title, modified_sign, subtitle);
IupSetfAttributeId(tabs, "TABTITLE", pos, "%s%s", title, modified_sign);
IupSetStrAttributeId(tabs, "TABTIP", pos, filename);
}
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 renameFile(Ihandle *ih, Ihandle *config, Ihandle *multitext, const char *old_filename, const char *new_filename)
{
IFnss cb;
if (old_filename[0] != 0)
{
if (rename(old_filename, new_filename) != 0)
{
IupMessageError(ih, "Failed to rename file. File already exists.");
return 0;
}
}
if (multitext)
{
IupSetStrAttribute(multitext, "FILENAME", new_filename);
updateTitle(multitext, IupGetInt(multitext, "MODIFIED"));
IupSetAttribute(config, "RECENTNAME", "ScintillaRecent");
IupConfigRecentUpdate(config, new_filename);
if (old_filename[0] != 0)
{
cb = (IFnss)IupGetCallback(ih, "NEWFILENAME_CB");
if (cb)
cb(ih, (char*)old_filename, (char*)new_filename);
}
}
return 1;
}
static void openFolder(char *filename)
{
char folder[10240] = "\"";
char* title, *exec;
strcpy(folder + 1, filename);
title = (char*)strFileTitle(folder + 1);
title[0] = '"';
title[1] = 0;
#ifdef WIN32
exec = "explorer";
#else
exec = "nautilus";
#endif
IupExecute(exec, folder);
}
static int multitext_caret_cb(Ihandle* multitext, int lin, int col);
static int searchInFile(Ihandle* multitext, Ihandle *find_txt, int find_start, int find_end, int wrap, int down, int casesensitive, int whole_word, int regexp, int posix)
{
char* str_to_find;
char flags[80];
int pos_start, pos_end;
int found = 0;
flags[0] = 0;
if (casesensitive)
strcpy(flags, "MATCHCASE");
if (whole_word)
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "WHOLEWORD");
if (regexp)
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "REGEXP");
if (posix)
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "POSIX");
if (flags[0] != 0)
IupSetAttribute(multitext, "SEARCHFLAGS", flags);
else
IupSetAttribute(multitext, "SEARCHFLAGS", NULL);
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
if (pos_start == find_start && pos_end == find_end && wrap)
{
/* if not found and wrap search again in the complementary region */
find_end = find_start;
find_start = down ? 0 : IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
}
if (pos_start != find_start || pos_end != find_end)
{
int lin, col;
IupSetFocus(multitext);
IupSetfAttribute(multitext, "SELECTIONPOS", "%d:%d", pos_start, pos_end);
/* update statusbar */
IupTextConvertPosToLinCol(multitext, pos_end, &lin, &col);
multitext_caret_cb(multitext, lin, col);
found = 1;
}
return found;
}
/********************************** Interface Utilities *****************************************/
static Ihandle* get_project_tree(Ihandle* ih_item)
{
Ihandle* projectTree = (Ihandle*)IupGetAttribute(ih_item, "PROJECTTREE");
if (!projectTree)
projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
return projectTree;
}
static void update_dialog_title(Ihandle* multitext)
{
Ihandle* ih = IupGetDialog(multitext);
char* subtitle = IupGetAttribute(ih, "SUBTITLE");
char* modified_sign = "";
char* filename = IupGetAttribute(multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(multitext, "NEW_FILENAME");
if (IupGetInt(multitext, "MODIFIED"))
modified_sign = "*";
IupSetfAttribute(ih, "TITLE", "%s%s - %s", strFileTitle(filename), modified_sign, subtitle);
}
static int multitext_caret_cb(Ihandle* multitext, int lin, int col)
{
Ihandle *statusbar = IupGetDialogChild(multitext, "STATUSBAR");
IupSetfAttribute(statusbar, "TITLE", "Lin %d, Col %d", lin + 1, col + 1); /* in Scintilla lin and col start at 0 */
return IUP_DEFAULT;
}
static int multitext_marginclick_cb(Ihandle* multitext, int margin, int lin, char *status)
{
(void)status;
toggleMarker(multitext, lin, margin);
return IUP_DEFAULT;
}
static int multitext_savepoint_cb(Ihandle* multitext, int state)
{
if (state == 1) /* save point */
updateTitle(multitext, 0);
else
updateTitle(multitext, 1);
return IUP_DEFAULT;
}
static int multitext_updateselection_cb(Ihandle* multitext)
{
/* Indicators 0-7 could be in use by a lexer
so we'll use indicator 8 to highlight words. */
const int id = 8;
int find_start, find_end, startPos, endPos;
IupGetIntInt(multitext, "SELECTIONPOS", &startPos, &endPos);
IupSetfAttribute(multitext, "INDICATORCLEARRANGE", "%d:%d", 0, IupGetInt(multitext, "COUNT"));
if (startPos == endPos)
return IUP_IGNORE;
IupSetInt(multitext, "INDICATORCURRENT", id);
IupSetAttributeId(multitext, "INDICATORSTYLE", id, "STRAIGHTBOX");
IupSetAttributeId(multitext, "INDICATORFGCOLOR", id, "0 255 0");
IupSetIntId(multitext, "INDICATOROUTLINEALPHA", id, 50);
IupSetIntId(multitext, "INDICATORALPHA", id, 50);
IupSetfAttribute(multitext, "WORDRANGE", "%d:%d", startPos, endPos);
if (IupGetInt(multitext, "ISWORD"))
{
char* find_txt = IupGetAttribute(multitext, "SELECTEDTEXT");
IupSetAttribute(multitext, "SEARCHFLAGS", "WHOLEWORD");
find_start = -1;
find_end = IupGetInt(multitext, "COUNT") + 1;
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
IupSetAttribute(multitext, "SEARCHINTARGET", find_txt);
startPos = IupGetInt(multitext, "TARGETSTART");
endPos = IupGetInt(multitext, "TARGETEND");
while (find_start != startPos && find_end != endPos)
{
IupSetfAttribute(multitext, "INDICATORFILLRANGE", "%d:%d", startPos, endPos - startPos);
find_start = endPos;
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end + 1);
IupSetAttribute(multitext, "SEARCHINTARGET", find_txt);
startPos = IupGetInt(multitext, "TARGETSTART");
endPos = IupGetInt(multitext, "TARGETEND");
}
}
return IUP_DEFAULT;
}
static void iScintillaDlgSetConfigMultitext(Ihandle* ih, Ihandle* config, Ihandle* multitext);
static int item_paste_action_cb(Ihandle* item_paste);
static int item_case_action_cb(Ihandle* ih_item);
static int dropfiles_cb(Ihandle* multitext, const char* filename, int num, int x, int y);
static int item_windowN_action_cb(Ihandle* ih_item);
static void multitext_add_menuitem(Ihandle* item_window1)
{
Ihandle* menu = IupGetParent(item_window1);
int count = IupGetChildCount(menu);
Ihandle* item_windowN = IupItem("N", NULL);
IupSetCallback(item_windowN, "ACTION", (Icallback)item_windowN_action_cb);
IupInsert(menu, IupGetChild(menu, count - 2), item_windowN); /* before the separator */
if (item_window1->handle)
IupMap(item_windowN);
}
static Ihandle* iScintillaDlgNewMultitext(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* item_window1 = IupGetDialogChild(ih, "ITEM_WINDOW1");
Ihandle* config = iScintillaDlgGetConfig(ih);
int count;
IFnn cb;
Ihandle* multitext = IupScintilla();
IupSetAttribute(multitext, "EXPAND", "YES");
IupSetAttribute(multitext, "VISIBLELINES", "5");
IupSetAttribute(multitext, "SAVEPOINT", NULL);
IupSetCallback(multitext, "CARET_CB", (Icallback)multitext_caret_cb);
IupSetCallback(multitext, "SAVEPOINT_CB", (Icallback)multitext_savepoint_cb);
IupSetCallback(multitext, "DROPFILES_CB", (Icallback)dropfiles_cb);
IupSetCallback(multitext, "MARGINCLICK_CB", (Icallback)multitext_marginclick_cb);
IupSetCallback(multitext, "UPDATESELECTION_CB", (Icallback)multitext_updateselection_cb);
/* highlight color for BRACEHIGHLIGHT */
IupSetAttribute(multitext, "STYLEFGCOLOR34", "255 0 0");
/* change the default for visibility of word warps */
IupSetAttribute(multitext, "WORDWRAPVISUALFLAGS", "MARGIN");
/* line numbers margin=0 */
IupSetAttribute(multitext, "MARGINWIDTH0", LINENUMBER_MARGIN);
IupSetAttribute(multitext, "MARGINSENSITIVE0", "YES");
/* bookmarks margin=1 */
IupSetAttribute(multitext, "MARGINWIDTH1", BOOKMARK_MARGIN);
IupSetAttribute(multitext, "MARGINTYPE1", "SYMBOL");
IupSetAttribute(multitext, "MARGINSENSITIVE1", "YES");
IupSetAttribute(multitext, "MARGINMASKFOLDERS1", "NO"); /* (disable folding) */
IupSetAttributeId(multitext, "MARGINMASK", 1, "1"); /* 0001 - marker=0 */
/* bookmarks marker=0 */
IupSetAttributeId(multitext, "MARKERFGCOLOR", 0, "0 0 255");
IupSetAttributeId(multitext, "MARKERBGCOLOR", 0, "0 0 255");
IupSetAttributeId(multitext, "MARKERALPHA", 0, "80");
IupSetAttributeId(multitext, "MARKERSYMBOL", 0, "BOOKMARK");
/* Ctrl+C, Ctrl+X, Ctrl+A, Del, already implemented inside IupScintilla */
IupSetCallback(multitext, "K_cV", (Icallback)item_paste_action_cb); /* replace system processing */
IupSetCallback(multitext, "K_cU", (Icallback)item_case_action_cb);
IupAppend(tabs, multitext);
cb = (IFnn)IupGetCallback(ih, "NEWTEXT_CB");
if (cb) cb(ih, multitext);
if (tabs->handle)
{
IupMap(multitext);
if (tabs->firstchild == multitext)
IupRefresh(tabs);
else
IupRefreshChildren(tabs);
}
iScintillaDlgSetConfigMultitext(ih, config, multitext);
IupSetAttribute(tabs, "VALUE_HANDLE", (char*)multitext);
IupSetStrAttributeId(multitext, "STYLEBGCOLOR", 33, IupGetGlobal("DLGBGCOLOR")); /* line number style color, reset by IupFlatTabs default BGCOLOR */
count = IupGetChildCount(tabs);
if (count > 1 && count <= WINDOWMENU_MAX)
multitext_add_menuitem(item_window1);
return multitext;
}
static int save_check(Ihandle* multitext);
static int iScintillaDlgCloseMultitext(Ihandle* multitext, int check)
{
Ihandle* tabs = IupGetParent(multitext);
Ihandle* item_window1 = IupGetDialogChild(tabs, "ITEM_WINDOW1");
IFnn cb;
int count;
if (check)
{
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(multitext);
Ihandle* config = iScintillaDlgGetConfig(multitext);
if (projectConfig)
saveMarkers(projectConfig, multitext);
else
saveMarkers(config, multitext);
if (!save_check(multitext))
return 0;
}
count = IupGetChildCount(tabs);
if (count > 1 && count <= WINDOWMENU_MAX)
{
/* remove the second menu item (anyone but the first) */
Ihandle* item_windowN = IupGetBrother(item_window1);
IupDestroy(item_windowN);
}
cb = (IFnn)IupGetCallback(IupGetDialog(tabs), "CLOSETEXT_CB");
if (cb) cb(IupGetDialog(tabs), multitext);
IupDestroy(multitext);
return 1;
}
static Ihandle* iScintillaDlgGetCurrentMultitext(Ihandle* ih)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
if (!tabs) return (Ihandle*)iupAttribGetInherit(ih, "MULTITEXT"); /* from the context menu */
return (Ihandle*)IupGetAttribute(tabs, "VALUE_HANDLE");
}
static void new_file(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgNewMultitext(ih_item);
static int new_count = 1;
IupSetStrf(multitext, "NEW_FILENAME", "Untitled #%d", new_count);
new_count++;
IupSetAttribute(multitext, "FILENAME", NULL);
IupSetAttribute(multitext, "VALUE", ""); /* empty text */
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
}
static void open_file(Ihandle* ih_item, const char* filename, int check_empty)
{
char* str = readFile(filename);
if (str)
{
IFnn load_cb;
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext = iScintillaDlgNewMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(ih_item);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
IupSetAttribute(config, "RECENTNAME", "ScintillaRecent");
IupConfigRecentUpdate(config, filename);
IupSetStrAttribute(multitext, "FILENAME", filename);
IupSetStrAttribute(multitext, "VALUE", str);
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
if (projectConfig)
restoreMarkers(projectConfig, multitext);
else
restoreMarkers(config, multitext);
free(str);
load_cb = (IFnn)IupGetCallback(ih, "LOADFILE_CB");
if (load_cb)
load_cb(ih, multitext);
if (check_empty && IupGetChildCount(tabs) == 2)
{
multitext = IupGetChild(tabs, 0);
filename = IupGetAttribute(multitext, "FILENAME");
if (!filename && IupGetInt(multitext, "COUNT") == 0) /* an empty non saved single file is replaced by the open file */
iScintillaDlgCloseMultitext(multitext, 0);
}
}
else
IupMessageError(IupGetDialog(ih_item), "IUP_ERRORFILEOPEN");
}
static void loadProjectFiles(Ihandle *projectConfig, Ihandle *projectTree);
static int item_close_proj_action_cb(Ihandle* ih_item);
static void open_proj(Ihandle *ih, const char *filename)
{
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGLOAD_CB");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle* projectSplit = IupGetDialogChild(ih, "PROJECTSPLIT");
Ihandle* config = iScintillaDlgGetConfig(ih);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
if (projectConfig)
{
if (item_close_proj_action_cb(ih) == IUP_IGNORE)
return;
}
IupSetAttribute(config, "RECENTNAME", "ScintillaRecentProject");
IupConfigRecentUpdate(config, filename);
projectConfig = IupConfig();
iupAttribSet(ih, "_IUP_PROJECT_CONFIG", (char*)projectConfig);
IupSetStrAttribute(projectConfig, "APP_FILENAME", filename);
IupSetAttribute(projectTree, "TITLE0", strFileTitle(filename));
IupConfigLoad(projectConfig);
if (cb)
cb(ih, projectConfig);
loadProjectFiles(projectConfig, projectTree);
if (IupGetInt(projectSplit, "VALUE") == 0)
{
IupSetAttribute(projectSplit, "VALUE", "200");
IupRefresh(ih);
}
}
static void revert_file(Ihandle* multitext)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
char* str = readFile(filename);
if (str)
{
IFnn load_cb;
Ihandle* ih = IupGetDialog(multitext);
Ihandle* config = iScintillaDlgGetConfig(multitext);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
IupSetStrAttribute(multitext, "VALUE", str);
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
if (projectConfig)
restoreMarkers(projectConfig, multitext);
else
restoreMarkers(config, multitext);
free(str);
load_cb = (IFnn)IupGetCallback(ih, "LOADFILE_CB");
if (load_cb)
load_cb(ih, multitext);
}
else
IupMessageError(IupGetDialog(multitext), "IUP_ERRORFILEOPEN");
}
static int item_saveas_action_cb(Ihandle* ih_item);
static void save_file(Ihandle* multitext)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
if (!filename)
item_saveas_action_cb(multitext);
else
{
char* str = IupGetAttribute(multitext, "VALUE");
int count = IupGetInt(multitext, "COUNT");
Ihandle* ih = IupGetDialog(multitext);
if (writeFile(filename, str, count))
{
IFnn save_cb;
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
save_cb = (IFnn)IupGetCallback(ih, "SAVEFILE_CB");
if (save_cb)
save_cb(ih, multitext);
}
else
IupMessageError(ih, "IUP_ERRORFILESAVE");
}
}
static void saveas_file(Ihandle* multitext, const char* filename)
{
char* str = IupGetAttribute(multitext, "VALUE");
int count = IupGetInt(multitext, "COUNT");
Ihandle* ih = IupGetDialog(multitext);
if (writeFile(filename, str, count))
{
IFnn save_cb;
Ihandle* config = iScintillaDlgGetConfig(multitext);
char* old_filename = IupGetAttribute(multitext, "FILENAME");
if (!old_filename) old_filename = IupGetAttribute(multitext, "NEW_FILENAME");
old_filename = iupStrDup(old_filename);
IupSetAttribute(config, "RECENTNAME", "ScintillaRecent");
IupConfigRecentUpdate(config, filename);
IupSetStrAttribute(multitext, "FILENAME", filename);
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
if (old_filename)
{
IFnss new_cb = (IFnss)IupGetCallback(ih, "NEWFILENAME_CB");
if (new_cb)
new_cb(ih, old_filename, (char*)filename);
}
save_cb = (IFnn)IupGetCallback(ih, "SAVEFILE_CB");
if (save_cb)
save_cb(ih, multitext);
if (old_filename)
free(old_filename);
}
else
IupMessageError(ih, "IUP_ERRORFILESAVE");
}
static void savecopy_file(Ihandle* multitext, const char* filename)
{
char* str = IupGetAttribute(multitext, "VALUE");
int count = IupGetInt(multitext, "COUNT");
if (writeFile(filename, str, count))
{
Ihandle* config = iScintillaDlgGetConfig(multitext);
IupSetAttribute(config, "RECENTNAME", "ScintillaRecent");
IupConfigRecentUpdate(config, filename);
}
else
IupMessageError(IupGetDialog(multitext), "IUP_ERRORFILESAVE");
}
static int save_check(Ihandle* multitext)
{
if (IupGetInt(multitext, "MODIFIED"))
{
switch (IupMessageAlarm(IupGetDialog(multitext), "Attention!", "File not saved. Save it now?", "YESNOCANCEL"))
{
case 1: /* save the changes and continue */
save_file(multitext);
break;
case 2: /* ignore the changes and continue */
break;
case 3: /* cancel */
return 0;
}
}
return 1;
}
static void saveProject(Ihandle *ih, Ihandle *projectConfig, int show_dialog);
static int save_project_check(Ihandle* ih)
{
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
if (IupGetInt(projectConfig, "MODIFIED")) /* modifications in the file list only */
{
switch (IupMessageAlarm(ih, "Attention!", "Project not saved. Save it now?", "YESNOCANCEL"))
{
case 1: /* save the changes and continue */
saveProject(ih, projectConfig, 0);
break;
case 2: /* ignore the changes and continue */
break;
case 3: /* cancel */
return 0;
}
}
else /* project is automatically saved when not modified because of the other changes */
{
char *filename = IupGetAttribute(projectConfig, "APP_FILENAME");
if (filename)
{
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGSAVE_CB");
if (cb)
cb(ih, projectConfig);
saveAllMarkers(ih, projectConfig);
saveProjectOpenFilesList(ih, projectConfig);
IupConfigSave(projectConfig);
}
}
return 1;
}
static void toggle_bar_visibility(Ihandle* ih_item, Ihandle* bar)
{
if (IupGetInt(ih_item, "VALUE"))
{
IupSetAttribute(bar, "FLOATING", "YES");
IupSetAttribute(bar, "VISIBLE", "NO");
IupSetAttribute(ih_item, "VALUE", "OFF");
}
else
{
IupSetAttribute(bar, "FLOATING", "NO");
IupSetAttribute(bar, "VISIBLE", "YES");
IupSetAttribute(ih_item, "VALUE", "ON");
}
IupRefresh(bar); /* refresh the dialog layout */
}
static void set_find_replace_visibility(Ihandle* find_dlg, int show_replace)
{
Ihandle* replace_txt = IupGetDialogChild(find_dlg, "REPLACE_TEXT");
Ihandle* replace_lbl = IupGetDialogChild(find_dlg, "REPLACE_LABEL");
Ihandle* replace_bt = IupGetDialogChild(find_dlg, "REPLACE_BUTTON");
Ihandle* replace_all_bt = IupGetDialogChild(find_dlg, "REPLACE_ALL_BUTTON");
if (show_replace)
{
IupSetAttribute(replace_txt, "VISIBLE", "Yes");
IupSetAttribute(replace_lbl, "VISIBLE", "Yes");
IupSetAttribute(replace_bt, "VISIBLE", "Yes");
IupSetAttribute(replace_all_bt, "VISIBLE", "Yes");
IupSetAttribute(replace_txt, "FLOATING", "No");
IupSetAttribute(replace_lbl, "FLOATING", "No");
IupSetAttribute(replace_bt, "FLOATING", "No");
IupSetAttribute(replace_all_bt, "FLOATING", "No");
IupSetAttribute(find_dlg, "TITLE", "Replace");
}
else
{
IupSetAttribute(replace_txt, "FLOATING", "Yes");
IupSetAttribute(replace_lbl, "FLOATING", "Yes");
IupSetAttribute(replace_bt, "FLOATING", "Yes");
IupSetAttribute(replace_all_bt, "FLOATING", "Yes");
IupSetAttribute(replace_txt, "VISIBLE", "No");
IupSetAttribute(replace_lbl, "VISIBLE", "No");
IupSetAttribute(replace_bt, "VISIBLE", "No");
IupSetAttribute(replace_all_bt, "VISIBLE", "No");
IupSetAttribute(find_dlg, "TITLE", "Find");
}
IupSetAttribute(find_dlg, "SIZE", NULL); /* force a dialog resize on the IupRefresh */
IupRefresh(find_dlg);
}
/********************************** Callbacks *****************************************/
static int check_inproject(Ihandle* projectTree, const char* check_filename)
{
int i;
int count = IupGetInt(projectTree, "CHILDCOUNT0");
for (i = 1; i <= count; i++)
{
char* filename = IupTreeGetUserId(projectTree, i);
if (iupStrEqual(filename, check_filename))
{
IupMessageError(IupGetDialog(projectTree), "File already in project!");
return 1; /* exists, abort */
}
}
return 0; /* does NOT exists, continue */
}
static int check_open_revert(Ihandle* ih, const char* check_filename)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
if (filename && iupStrEqual(filename, check_filename))
{
/* found, check if modified and offer to revert it */
if (IupGetInt(multitext, "MODIFIED") &&
IupMessageAlarm(IupGetDialog(tabs), "Attention!", "File already opened, but modified. Do you want to revert it?", "YESNO") == 1)
revert_file(multitext);
return 1; /* exists, abort */
}
}
return 0; /* does NOT exists, continue */
}
static Ihandle* find_open(Ihandle* ih, const char* check_filename)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(multitext, "NEW_FILENAME");
if (iupStrEqual(filename, check_filename))
{
/* found */
return multitext; /* exists, abort */
}
}
return NULL; /* does NOT exists, continue */
}
static int check_open_to_save(Ihandle* ih, const char* check_filename)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
if (filename && iupStrEqual(filename, check_filename))
{
/* found */
IupMessageError(IupGetDialog(tabs), "File already opened. Can not save using this filename.");
return 1; /* exists, abort */
}
}
return 0; /* does NOT exists, continue */
}
static int find_ext(const char* filename, const char* ext)
{
char file_ext[10] = ".";
int len = (int)strlen(filename);
int ext_len = (int)strlen(ext);
if (ext_len > len) return 0;
iupStrLower(file_ext, filename + len - ext_len);
return strcmp(file_ext, ext) == 0;
}
static int dropfiles_cb(Ihandle* ih, const char* filename, int num, int x, int y)
{
static int remove_empty = 0;
char ext[10] = ".";
char* project_ext = IupGetAttribute(ih, "PROJECT_EXT");
if (!project_ext) project_ext = "prj";
strcat(ext, project_ext);
(void)x;
(void)y;
if (num >= 0 && !remove_empty)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
if (IupGetChildCount(tabs) == 1)
{
Ihandle* multitext = IupGetChild(tabs, 0);
char* m_filename = IupGetAttribute(multitext, "FILENAME");
if (!m_filename && IupGetInt(multitext, "COUNT") == 0) /* an empty non saved single file is replaced by the open file */
remove_empty = 1;
}
}
if (find_ext(filename, ext))
open_proj(IupGetDialog(ih), filename);
else
{
if (!check_open_revert(ih, filename))
open_file(ih, filename, 0); /* no check empty */
}
if (num == 0 && remove_empty) /* last dropped file */
{
/* do it only after all files are dropped, to avoid destruction of the dropped target during callback calls */
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
if (IupGetChildCount(tabs) > 1)
{
Ihandle* multitext = IupGetChild(tabs, 0);
iScintillaDlgCloseMultitext(multitext, 0);
}
remove_empty = 0;
}
return IUP_DEFAULT;
}
static int file_menu_open_cb(Ihandle* ih_menu)
{
Ihandle* item_revert = IupGetDialogChild(ih_menu, "ITEM_REVERT");
Ihandle* item_save = IupGetDialogChild(ih_menu, "ITEM_SAVE");
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_menu);
char* filename = IupGetAttribute(multitext, "FILENAME");
int modified = IupGetInt(multitext, "MODIFIED");
if (modified)
IupSetAttribute(item_save, "ACTIVE", "YES");
else
IupSetAttribute(item_save, "ACTIVE", "NO");
if (modified && filename)
IupSetAttribute(item_revert, "ACTIVE", "YES");
else
IupSetAttribute(item_revert, "ACTIVE", "NO");
return IUP_DEFAULT;
}
static int edit_menu_open_cb(Ihandle* ih_menu)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih_menu, "FIND_DIALOG");
Ihandle *item_undo = IupGetDialogChild(ih_menu, "ITEM_UNDO");
Ihandle *item_redo = IupGetDialogChild(ih_menu, "ITEM_REDO");
Ihandle *item_paste = IupGetDialogChild(ih_menu, "ITEM_PASTE");
Ihandle *item_cut = IupGetDialogChild(ih_menu, "ITEM_CUT");
Ihandle *item_delete = IupGetDialogChild(ih_menu, "ITEM_DELETE");
Ihandle *item_copy = IupGetDialogChild(ih_menu, "ITEM_COPY");
Ihandle *item_find_next = IupGetDialogChild(ih_menu, "ITEM_FINDNEXT");
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_menu);
if (IupGetInt(multitext, "UNDO"))
IupSetAttribute(item_undo, "ACTIVE", "YES");
else
IupSetAttribute(item_undo, "ACTIVE", "NO");
if (IupGetInt(multitext, "REDO"))
IupSetAttribute(item_redo, "ACTIVE", "YES");
else
IupSetAttribute(item_redo, "ACTIVE", "NO");
if (IupGetInt(multitext, "CLIPBOARD"))
IupSetAttribute(item_paste, "ACTIVE", "YES");
else
IupSetAttribute(item_paste, "ACTIVE", "NO");
if (IupGetAttribute(multitext, "SELECTEDTEXT"))
{
IupSetAttribute(item_cut, "ACTIVE", "YES");
IupSetAttribute(item_delete, "ACTIVE", "YES");
IupSetAttribute(item_copy, "ACTIVE", "YES");
}
else
{
IupSetAttribute(item_cut, "ACTIVE", "NO");
IupSetAttribute(item_delete, "ACTIVE", "NO");
IupSetAttribute(item_copy, "ACTIVE", "NO");
}
if (find_dlg)
{
Ihandle* txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
char* str_to_find = IupGetAttribute(txt, "VALUE");
if (!str_to_find || str_to_find[0] == 0)
IupSetAttribute(item_find_next, "ACTIVE", "NO");
else
IupSetAttribute(item_find_next, "ACTIVE", "Yes");
}
else
IupSetAttribute(item_find_next, "ACTIVE", "NO");
return IUP_DEFAULT;
}
static int window_menu_open_cb(Ihandle* ih_menu)
{
Ihandle* tabs = IupGetDialogChild(ih_menu, "MULTITEXT_TABS");
Ihandle* item_window1 = IupGetDialogChild(tabs, "ITEM_WINDOW1");
Ihandle* current_multitext = (Ihandle*)IupGetAttribute(tabs, "VALUE_HANDLE");
Ihandle* m_multitext, *item_windowN;
int pos;
for (m_multitext = tabs->firstchild, pos = 0, item_windowN = item_window1; m_multitext && pos < WINDOWMENU_MAX && item_windowN; m_multitext = m_multitext->brother, pos++, item_windowN = item_windowN->brother)
{
char* filename = IupGetAttribute(m_multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(m_multitext, "NEW_FILENAME");
IupSetfAttribute(item_windowN, "TITLE", "&%d %s", pos + 1, strFileTitle(filename));
if (m_multitext == current_multitext)
IupSetAttribute(item_windowN, "VALUE", "ON");
else
IupSetAttribute(item_windowN, "VALUE", "OFF");
}
return IUP_DEFAULT;
}
static int project_menu_open_cb(Ihandle* ih_menu)
{
Ihandle* ih = IupGetDialog(ih_menu);
Ihandle* item_save_proj = IupGetDialogChild(ih_menu, "ITEM_SAVE_PROJ");
Ihandle* item_save_proj_as = IupGetDialogChild(ih_menu, "ITEM_SAVE_PROJ_AS");
Ihandle* item_close_proj = IupGetDialogChild(ih_menu, "ITEM_CLOSE_PROJ");
Ihandle* item_add_new_proj = IupGetDialogChild(ih_menu, "ITEM_ADD_NEW_FILE");
Ihandle* item_add_exist_proj = IupGetDialogChild(ih_menu, "ITEM_ADD_EXIST_FILE");
Ihandle* item_add_open_proj = IupGetDialogChild(ih_menu, "ITEM_ADD_OPEN_FILE");
Ihandle* item_open_proj_file = IupGetDialogChild(ih_menu, "ITEM_OPEN_PROJ_FILE");
Ihandle* item_open_all_proj_file = IupGetDialogChild(ih_menu, "ITEM_OPEN_ALL_PROJ_FILE");
Ihandle* item_remove_proj_file = IupGetDialogChild(ih_menu, "ITEM_REMOVE_PROJ_FILE");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
if (projectConfig)
{
IupSetAttribute(item_close_proj, "ACTIVE", "YES");
IupSetAttribute(item_add_new_proj, "ACTIVE", "YES");
IupSetAttribute(item_add_exist_proj, "ACTIVE", "YES");
IupSetAttribute(item_add_open_proj, "ACTIVE", "YES");
IupSetAttribute(item_open_proj_file, "ACTIVE", "YES");
IupSetAttribute(item_open_all_proj_file, "ACTIVE", "YES");
IupSetAttribute(item_remove_proj_file, "ACTIVE", "YES");
IupSetAttribute(item_save_proj_as, "ACTIVE", "YES");
if (IupGetInt(projectConfig, "MODIFIED"))
IupSetAttribute(item_save_proj, "ACTIVE", "YES");
else
IupSetAttribute(item_save_proj, "ACTIVE", "NO");
}
else
{
IupSetAttribute(item_close_proj, "ACTIVE", "NO");
IupSetAttribute(item_add_new_proj, "ACTIVE", "NO");
IupSetAttribute(item_save_proj, "ACTIVE", "NO");
IupSetAttribute(item_save_proj_as, "ACTIVE", "NO");
IupSetAttribute(item_add_exist_proj, "ACTIVE", "NO");
IupSetAttribute(item_add_open_proj, "ACTIVE", "NO");
IupSetAttribute(item_open_proj_file, "ACTIVE", "NO");
IupSetAttribute(item_open_all_proj_file, "ACTIVE", "NO");
IupSetAttribute(item_remove_proj_file, "ACTIVE", "NO");
}
return IUP_DEFAULT;
}
static int view_menu_open_cb(Ihandle *ih_menu)
{
Ihandle* item_panel = IupGetDialogChild(ih_menu, "ITM_PANEL");
Ihandle* panelSplit = IupGetDialogChild(ih_menu, "PANEL_SPLIT");
if (IupGetInt(panelSplit, "VALUE") == 1000)
IupSetAttribute(item_panel, "VALUE", "OFF");
else
IupSetAttribute(item_panel, "VALUE", "ON");
return IUP_DEFAULT;
}
static int config_recent_cb(Ihandle* ih_item)
{
char* filename = IupGetAttribute(ih_item, "TITLE");
if (!check_open_revert(ih_item, filename))
open_file(ih_item, filename, 1);
return IUP_DEFAULT;
}
static int config_recent_proj_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
char* filename = IupGetAttribute(ih_item, "TITLE");
open_proj(ih, filename);
return IUP_DEFAULT;
}
static int item_new_action_cb(Ihandle* ih_item)
{
new_file(ih_item);
return IUP_IGNORE; /* to avoid garbage in Scintilla when pressing the hot key */
}
static int item_open_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle *filedlg;
Ihandle* config;
const char* dir = NULL;
char* extra_filters = IupGetAttribute(ih, "EXTRAFILTERS");
config = iScintillaDlgGetConfig(ih_item);
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "OPEN");
if (extra_filters)
IupSetStrf(filedlg, "EXTFILTER", "%sText Files|*.txt|All Files|*.*|", extra_filters);
else
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttribute(filedlg, "MULTIPLEFILES", "Yes");
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
int i, count = IupGetInt(filedlg, "MULTIVALUECOUNT");
dir = IupGetAttributeId(filedlg, "MULTIVALUE", 0);
for (i = 1; i < count; i++) /* i==0 contains the path */
{
char* filetitle = IupGetAttributeId(filedlg, "MULTIVALUE", i);
char filename[10240];
strcpy(filename, dir);
strcat(filename, filetitle);
if (!check_open_revert(ih, filename))
open_file(ih_item, filename, 1);
}
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static char* get_filename_value(Ihandle *filedlg, const char* ext)
{
char* value = IupGetAttribute(filedlg, "VALUE");
if (ext)
{
char* new_ext = iupStrFileGetExt(value);
if (!new_ext)
{
IupSetStrf(filedlg, "FILENAME", "%s.%s", value, ext);
return IupGetAttribute(filedlg, "FILENAME");
}
free(new_ext);
}
return value;
}
static int item_saveas_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
const char* dir;
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(multitext);
Ihandle *filedlg = IupFileDlg();
char* extra_filters = IupGetAttribute(ih, "EXTRAFILTERS");
char* old_filename = IupGetAttribute(multitext, "FILENAME");
if (!old_filename) old_filename = IupGetAttribute(multitext, "NEW_FILENAME");
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
if (extra_filters)
IupSetStrf(filedlg, "EXTFILTER", "%sText Files|*.txt|All Files|*.*|", extra_filters);
else
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "FILE", old_filename);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
char* filename = get_filename_value(filedlg, IupGetAttribute(ih, "DEFAULT_EXT"));
if (iupStrEqual(old_filename, filename))
save_file(multitext);
else if (!check_open_to_save(ih, filename))
saveas_file(multitext, filename);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int item_savecopy_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
const char* dir;
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(multitext);
Ihandle *filedlg = IupFileDlg();
char* extra_filters = IupGetAttribute(ih, "EXTRAFILTERS");
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
if (extra_filters)
IupSetStrf(filedlg, "EXTFILTER", "%sText Files|*.txt|All Files|*.*|", extra_filters);
else
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "FILE", IupGetAttribute(multitext, "FILENAME"));
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
char* filename = get_filename_value(filedlg, IupGetAttribute(ih, "DEFAULT_EXT"));
savecopy_file(multitext, filename);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int item_saveall_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(ih_item);
Ihandle* multitext;
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (IupGetInt(multitext, "MODIFIED"))
save_file(multitext);
}
if (projectConfig)
saveProject(ih_item, projectConfig, 0);
return IUP_DEFAULT;
}
static int item_save_action_cb(Ihandle* ih_item)
{
if (IupGetInt(NULL, "SHIFTKEY"))
item_saveall_action_cb(ih_item);
else
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item); /* ih_item can be from the context menu */
/* test again because in can be called using the hot key */
if (IupGetInt(multitext, "MODIFIED"))
save_file(multitext);
}
return IUP_IGNORE; /* to avoid garbage in Scintilla when pressing the hot key */
}
static int item_closeall_action_cb(Ihandle* ih_item)
{
Ihandle* multitext, *tmp;
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
if (!tabs) tabs = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT_TABS"); /* from the context menu */
for (multitext = tabs->firstchild; multitext; /* increment before destroy */)
{
/* increment before destroy */
tmp = multitext;
multitext = multitext->brother;
if (!iScintillaDlgCloseMultitext(tmp, 1))
return IUP_DEFAULT;
}
new_file(tabs); /* always keep at least one multitext */
return IUP_DEFAULT;
}
static int item_close_action_cb(Ihandle* ih_item)
{
if (IupGetInt(NULL, "SHIFTKEY"))
item_closeall_action_cb(ih_item);
else
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item); /* ih_item can be from the context menu */
Ihandle* tabs = IupGetParent(multitext);
if (!iScintillaDlgCloseMultitext(multitext, 1))
return IUP_DEFAULT;
if (IupGetChildCount(tabs) == 0)
new_file(ih_item); /* always keep at least one multitext */
}
return IUP_DEFAULT;
}
static int item_closeall_butthis_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT_TABS"); /* from the context menu */
Ihandle* this_multitext = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT"); /* from the context menu */
Ihandle* multitext, *tmp;
for (multitext = tabs->firstchild; multitext; /* increment before destroy */)
{
if (this_multitext != multitext)
{
/* increment before destroy */
tmp = multitext;
multitext = multitext->brother;
if (!iScintillaDlgCloseMultitext(tmp, 1))
return IUP_DEFAULT;
}
else
multitext = multitext->brother;
}
return IUP_DEFAULT;
}
static int item_rename_action_cb(Ihandle* ih_item)
{
Ihandle* config = iScintillaDlgGetConfig(ih_item);
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* ih = IupGetDialog(ih_item);
char new_name[512], new_filename[10240];
char* old_filename = IupGetAttribute(multitext, "FILENAME");
if (!old_filename) old_filename = IupGetAttribute(multitext, "NEW_FILENAME");
old_filename = iupStrDup(old_filename);
strcpy(new_name, strFileTitle(old_filename));
if (!IupGetParam("Rename", setparent_param_cb, ih, "Name: %s\n", new_name, NULL))
{
free(old_filename);
return IUP_DEFAULT;
}
strcpy(new_filename, old_filename);
strcpy((char*)strFileTitle(new_filename), new_name);
renameFile(ih, config, multitext, old_filename, new_filename);
free(old_filename);
return IUP_DEFAULT;
}
static int item_revert_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item); /* ih_item can be from the context menu */
revert_file(multitext);
return IUP_DEFAULT;
}
static int item_print_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(ih_item);
const char* value;
value = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginLeft");
if (value)
IupSetStrAttribute(multitext, "PRINTMARGINLEFT", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginRight");
if (value)
IupSetStrAttribute(multitext, "PRINTMARGINRIGHT", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginTop");
if (value)
IupSetStrAttribute(multitext, "PRINTMARGINTOP", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginBottom");
if (value)
IupSetStrAttribute(multitext, "PRINTMARGINBOTTOM", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginUnits");
if (value)
IupSetStrAttribute(multitext, "PRINTMARGINUNITS", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "WordWrap");
if (value)
IupSetStrAttribute(multitext, "PRINTWORDWRAP", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "Color");
if (value)
IupSetStrAttribute(multitext, "PRINTCOLOR", value);
value = IupConfigGetVariableStr(config, "ScintillaPrint", "Magnification");
if (value)
IupSetStrAttribute(multitext, "PRINTMAGNIFICATION", value);
IupSetAttribute(multitext, "PRINT", IupGetAttribute(IupGetDialog(multitext), "TITLE"));
return IUP_DEFAULT;
}
static int getListIndex(const char* value, const char* list[], int count)
{
int i;
if (!value)
return 0;
for (i = 0; i < count; i++)
{
if (iupStrEqualNoCase(list[i], value))
return i;
}
return 0;
}
static const char* getListValue(int index, const char* list[])
{
return list[index];
}
static int item_pagesetup_action_cb(Ihandle* ih_item)
{
Ihandle* config = iScintillaDlgGetConfig(ih_item);
double margin_left, margin_top, margin_right, margin_bottom;
int margin_units_index, word_wrap_index, color_index;
const char* margin_units_list[] = { "PIXELS", "INCH", "CM" };
const char* word_wrap_list[] = { "NONE", "CHAR", "WORD" };
const char* color_list[] = { "NORMAL", "INVERTLIGHT", "BLACKONWHITE", "COLORONWHITE" };
const char *margin_units, *word_wrap, *color;
int magnification;
margin_left = IupConfigGetVariableDouble(config, "ScintillaPrint", "MarginLeft");
margin_right = IupConfigGetVariableDouble(config, "ScintillaPrint", "MarginRight");
margin_top = IupConfigGetVariableDouble(config, "ScintillaPrint", "MarginTop");
margin_bottom = IupConfigGetVariableDouble(config, "ScintillaPrint", "MarginBottom");
margin_units = IupConfigGetVariableStr(config, "ScintillaPrint", "MarginUnits");
word_wrap = IupConfigGetVariableStr(config, "ScintillaPrint", "WordWrap");
color = IupConfigGetVariableStr(config, "ScintillaPrint", "Color");
magnification = IupConfigGetVariableInt(config, "ScintillaPrint", "Magnification");
margin_units_index = getListIndex(margin_units, margin_units_list, sizeof(margin_units_list));
word_wrap_index = getListIndex(word_wrap, word_wrap_list, sizeof(word_wrap_list));
color_index = getListIndex(color, color_list, sizeof(color_list));
if (IupGetParam("Page Setup", setparent_param_cb, IupGetDialog(ih_item),
"Margin Left: %R\n"
"Margin Right: %R\n"
"Margin Top: %R\n"
"Margin Bottom: %R\n"
"Margin Units: %l|Pixels|Inch|Cm|\n"
"Word Wrap: %l|None|Char|Word|\n"
"Color: %l|Normal|Invert Light|Black on White|Color on White|\n"
"Magnification: %i\n",
&margin_left, &margin_top, &margin_right, &margin_bottom,
&margin_units_index, &word_wrap_index, &color_index,
&magnification,
NULL))
{
margin_units = getListValue(margin_units_index, margin_units_list);
word_wrap = getListValue(word_wrap_index, word_wrap_list);
color = getListValue(color_index, color_list);
IupConfigSetVariableDouble(config, "ScintillaPrint", "MarginLeft", margin_left);
IupConfigSetVariableDouble(config, "ScintillaPrint", "MarginRight", margin_right);
IupConfigSetVariableDouble(config, "ScintillaPrint", "MarginTop", margin_top);
IupConfigSetVariableDouble(config, "ScintillaPrint", "MarginBottom", margin_bottom);
IupConfigSetVariableStr(config, "ScintillaPrint", "MarginUnits", margin_units);
IupConfigSetVariableStr(config, "ScintillaPrint", "WordWrap", word_wrap);
IupConfigSetVariableStr(config, "ScintillaPrint", "Color", color);
IupConfigSetVariableInt(config, "ScintillaPrint", "Magnification", magnification);
}
return IUP_DEFAULT;
}
static int item_openfolder_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT"); /* from the context menu */
char* filename = IupGetAttribute(multitext, "FILENAME");
openFolder(filename);
return IUP_DEFAULT;
}
static int item_copyfilename_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT"); /* from the context menu */
char* filename = IupGetAttribute(multitext, "FILENAME");
copyFilenameToClipboard(filename);
return IUP_DEFAULT;
}
static int item_addtoproject_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = (Ihandle*)iupAttribGetInherit(ih_item, "MULTITEXT"); /* from the context menu */
char* filename = IupGetAttribute(multitext, "FILENAME");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(multitext);
Ihandle *projectTree = get_project_tree(multitext);
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
return IUP_DEFAULT;
}
static int tabs_rightclick_cb(Ihandle* tabs, int pos)
{
Ihandle *menu, *item_close, *item_revert, *item_save, *item_closeall, *item_closeall_butthis,
*item_openfolder, *item_copyfilename, *item_addtoproject;
Ihandle* multitext = IupGetChild(tabs, pos);
char* filename = IupGetAttribute(multitext, "FILENAME");
int modified = IupGetInt(multitext, "MODIFIED");
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(tabs);
item_save = IupItem("Save\tCtrl+S", NULL);
IupSetAttribute(item_save, "IMAGE", "IUP_FileSave");
IupSetCallback(item_save, "ACTION", (Icallback)item_save_action_cb);
item_close = IupItem("Close\tCtrl+F4", NULL);
IupSetCallback(item_close, "ACTION", (Icallback)item_close_action_cb);
item_closeall = IupItem("Close All\tCtrl+Shift+F4", NULL);
IupSetCallback(item_closeall, "ACTION", (Icallback)item_closeall_action_cb);
item_closeall_butthis = IupItem("Close All But This", NULL);
IupSetCallback(item_closeall_butthis, "ACTION", (Icallback)item_closeall_butthis_action_cb);
item_revert = IupItem("Revert", NULL);
IupSetCallback(item_revert, "ACTION", (Icallback)item_revert_action_cb);
item_openfolder = IupItem("Open Containing Folder", NULL);
IupSetCallback(item_openfolder, "ACTION", (Icallback)item_openfolder_action_cb);
item_copyfilename = IupItem("Copy File Name", NULL);
IupSetCallback(item_copyfilename, "ACTION", (Icallback)item_copyfilename_action_cb);
item_addtoproject = IupItem("Add To Project", NULL);
IupSetCallback(item_addtoproject, "ACTION", (Icallback)item_addtoproject_action_cb);
if (modified)
IupSetAttribute(item_save, "ACTIVE", "YES");
else
IupSetAttribute(item_save, "ACTIVE", "NO");
if (modified && filename)
IupSetAttribute(item_revert, "ACTIVE", "YES");
else
IupSetAttribute(item_revert, "ACTIVE", "NO");
if (IupGetChildCount(tabs) > 1)
IupSetAttribute(item_closeall_butthis, "ACTIVE", "YES");
else
IupSetAttribute(item_closeall_butthis, "ACTIVE", "NO");
if (filename)
{
IupSetAttribute(item_openfolder, "ACTIVE", "YES");
IupSetAttribute(item_copyfilename, "ACTIVE", "YES");
}
else
{
IupSetAttribute(item_openfolder, "ACTIVE", "NO");
IupSetAttribute(item_copyfilename, "ACTIVE", "NO");
}
if (projectConfig)
IupSetAttribute(item_addtoproject, "ACTIVE", "YES");
else
IupSetAttribute(item_addtoproject, "ACTIVE", "NO");
menu = IupMenu(
item_revert,
item_save,
item_close,
item_closeall,
item_closeall_butthis,
IupSeparator(),
item_copyfilename,
item_openfolder,
IupSeparator(),
item_addtoproject,
NULL);
iupAttribSet(menu, "MULTITEXT_TABS", (char*)tabs);
iupAttribSet(menu, "MULTITEXT", (char*)multitext);
IupPopup(menu, IUP_MOUSEPOS, IUP_MOUSEPOS);
IupDestroy(menu);
return IUP_DEFAULT;
}
static int tabs_change_cb(Ihandle* tabs, Ihandle* new_tab, Ihandle* old_tab)
{
update_dialog_title(new_tab);
(void)tabs;
(void)old_tab;
return IUP_DEFAULT;
}
static int tabs_close_cb(Ihandle* tabs, int pos)
{
Ihandle* multitext = IupGetChild(tabs, pos);
if (!iScintillaDlgCloseMultitext(multitext, 1))
return IUP_IGNORE; /* to abort the CLOSE_CB callback */
if (IupGetChildCount(tabs) == 0)
new_file(tabs); /* always keep at least one multitext */
return IUP_IGNORE; /* we already destroyed the multitext */
}
static int find_close_action_cb(Ihandle* bt_close);
static int close_exit_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* config = iScintillaDlgGetConfig(ih);
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih, "FIND_DIALOG");
Ihandle* panelSplit = IupGetDialogChild(ih, "PANEL_SPLIT");
int pos;
Ihandle* multitext, *tmp;
IFnn configsave_cb;
Icallback cb;
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(ih);
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "Split", IupGetAttribute(panelSplit, "VALUE"));
if (projectConfig)
{
if (item_close_proj_action_cb(ih) == IUP_IGNORE)
return IUP_IGNORE;
}
for (multitext = tabs->firstchild, pos = 0; multitext; pos++ /* increment before destroy */)
{
/* increment before destroy */
tmp = multitext;
multitext = multitext->brother;
if (!iScintillaDlgCloseMultitext(tmp, 1))
return IUP_IGNORE; /* to abort the CLOSE_CB callback */
}
if (find_dlg)
find_close_action_cb(find_dlg);
configsave_cb = (IFnn)IupGetCallback(ih, "CONFIGSAVE_CB");
if (configsave_cb)
configsave_cb(ih, config);
IupConfigDialogClosed(config, ih, IupGetAttribute(ih, "SUBTITLE"));
IupConfigSave(config);
iupAttribSet(ih, "_IUP_CLOSING", "1");
IupHide(ih);
iupAttribSet(ih, "_IUP_CLOSING", NULL);
/* after hide, at the last moment */
cb = IupGetCallback(ih, "EXIT_CB");
if (cb)
cb(ih);
return IUP_DEFAULT;
}
static int tree_executeleaf_cb(Ihandle* projectTree, int id)
{
char* filename = IupTreeGetUserId(projectTree, id);
if (id == 0)
return IUP_DEFAULT;
if (!check_open_revert(projectTree, filename))
open_file(projectTree, filename, 1);
return IUP_DEFAULT;
}
static int tree_showrename_cb(Ihandle* projectTree, int id)
{
(void)projectTree;
if (id == 0)
return IUP_IGNORE;
return IUP_DEFAULT;
}
static int tree_rename_cb(Ihandle* projectTree, int id, char* new_name)
{
Ihandle* tabs = IupGetDialogChild(projectTree, "MULTITEXT_TABS");
Ihandle* multitext;
char* filename, *m_filename;
Ihandle* config = iScintillaDlgGetConfig(projectTree);
char new_filename[10240];
if (id == 0)
return IUP_IGNORE;
filename = IupTreeGetUserId(projectTree, id);
strcpy(new_filename, filename);
strcpy((char*)strFileTitle(new_filename), new_name);
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
m_filename = IupGetAttribute(multitext, "FILENAME");
if (iupStrEqual(m_filename, filename))
break;
}
if (renameFile(IupGetDialog(projectTree), config, multitext, filename, new_filename))
{
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(projectTree);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
IupSetStrAttributeId(projectTree, "TITLE", id, strFileTitle(new_filename));
IupTreeSetUserId(projectTree, id, iupStrDup(new_filename));
saveMarkers(projectConfig, multitext);
saveProjectFilesList(projectTree, projectConfig);
saveProjectOpenFilesList(projectTree, projectConfig);
free(filename);
}
return IUP_DEFAULT;
}
static int leaf_open_action_cb(Ihandle* ih_item)
{
Ihandle *projectTree = get_project_tree(ih_item);
int id = IupGetInt(projectTree, "VALUE");
char* filename;
/* can be called from the hot key */
if (id == 0)
return IUP_DEFAULT;
filename = IupTreeGetUserId(projectTree, id);
if (!check_open_revert(projectTree, filename))
open_file(projectTree, filename, 1);
return IUP_DEFAULT;
}
static int leaf_remove_action_cb(Ihandle* ih_item)
{
Ihandle *projectTree = get_project_tree(ih_item);
int id = IupGetInt(projectTree, "VALUE");
Ihandle* ih = IupGetDialog(projectTree);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
/* can be called from the hot key */
if (id == 0)
return IUP_DEFAULT;
removeFileFromProject(projectConfig, projectTree, id);
return IUP_DEFAULT;
}
static int leaf_rename_action_cb(Ihandle* ih_item)
{
Ihandle *projectTree = get_project_tree(ih_item);
int id = IupGetInt(projectTree, "VALUE");
/* can be called from the hot key */
if (id == 0)
return IUP_DEFAULT;
IupSetAttribute(projectTree, "RENAME", "Yes");
return IUP_DEFAULT;
}
static int leaf_copyfilename_action_cb(Ihandle* ih_item)
{
Ihandle *projectTree = get_project_tree(ih_item);
int id = IupGetInt(projectTree, "VALUE");
char* filename;
if (id == 0)
return IUP_DEFAULT;
filename = IupTreeGetUserId(projectTree, id);
copyFilenameToClipboard(filename);
return IUP_DEFAULT;
}
static int leaf_openfolder_action_cb(Ihandle* ih_item)
{
Ihandle *projectTree = get_project_tree(ih_item);
int id = IupGetInt(projectTree, "VALUE");
char* filename;
if (id == 0)
return IUP_DEFAULT;
filename = IupTreeGetUserId(projectTree, id);
openFolder(filename);
return IUP_DEFAULT;
}
static int tree_dropfiles_cb(Ihandle* projectTree, const char* filename, int num, int x, int y)
{
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(projectTree);
int id = IupConvertXYToPos(projectTree, x, y);
IupSetInt(projectTree, "VALUE", id);
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
(void)num;
return IUP_DEFAULT;
}
static int tree_rightclick_cb(Ihandle* projectTree, int id)
{
Ihandle *menu, *item_open, *item_remove, *item_rename, *item_copyfilename, *item_openfolder;
if (id == 0)
return IUP_DEFAULT;
IupSetInt(projectTree, "VALUE", id);
item_open = IupItem("&Open\tEnter", NULL);
IupSetAttribute(item_open, "IMAGE", "IUP_FileSave");
IupSetCallback(item_open, "ACTION", (Icallback)leaf_open_action_cb);
item_remove = IupItem("&Remove\tDel", NULL);
IupSetAttribute(item_remove, "IMAGE", "IUP_EditErase");
IupSetCallback(item_remove, "ACTION", (Icallback)leaf_remove_action_cb);
item_rename = IupItem("R&ename...\tF2", NULL);
IupSetCallback(item_rename, "ACTION", (Icallback)leaf_rename_action_cb);
item_copyfilename = IupItem("&Copy File Name", NULL);
IupSetCallback(item_copyfilename, "ACTION", (Icallback)leaf_copyfilename_action_cb);
item_openfolder = IupItem("Open Containing &Folder", NULL);
IupSetCallback(item_openfolder, "ACTION", (Icallback)leaf_openfolder_action_cb);
menu = IupMenu(
item_open,
item_remove,
item_rename,
IupSeparator(),
item_copyfilename,
item_openfolder,
NULL);
iupAttribSet(menu, "PROJECTTREE", (char*)projectTree);
IupPopup(menu, IUP_MOUSEPOS, IUP_MOUSEPOS);
IupDestroy(menu);
return IUP_DEFAULT;
}
static void tree_project_clear(Ihandle* projectTree)
{
int i = 1;
char* filename = IupTreeGetUserId(projectTree, i);
while (filename != NULL)
{
free(filename);
i++;
filename = IupTreeGetUserId(projectTree, i);
}
IupSetAttribute(projectTree, "DELNODE0", "CHILDREN");
}
static int list_search_dblclick_cb(Ihandle *listSearch, int index, char *t)
{
char *filename = IupGetAttributeId(listSearch, "FILENAME", index);
if (filename)
{
int lin = IupGetIntId(listSearch, "LINE", index);
int col = IupGetIntId(listSearch, "COL", index);
int start_pos = IupGetIntId(listSearch, "POSSTART", index);
int end_pos = IupGetIntId(listSearch, "POSEND", index);
Ihandle* multitext = find_open(listSearch, filename);
if (!multitext)
{
open_file(listSearch, filename, 1);
multitext = iScintillaDlgGetCurrentMultitext(listSearch);
}
else
{
Ihandle* tabs = IupGetDialogChild(listSearch, "MULTITEXT_TABS");
IupSetAttribute(tabs, "VALUE_HANDLE", (char*)multitext);
}
IupSetFocus(multitext);
IupSetfAttribute(multitext, "SELECTIONPOS", "%d:%d", start_pos, end_pos);
/* update statusbar */
IupTextConvertPosToLinCol(multitext, end_pos, &lin, &col);
multitext_caret_cb(multitext, lin, col);
}
(void)t;
return IUP_DEFAULT;
}
static void list_search_add(Ihandle* listSearch, Ihandle* multitext, int pos_start, int pos_end)
{
int search_count;
int lin, col;
char *filename = IupGetAttribute(multitext, "FILENAME");
if (!filename) filename = IupGetAttribute(multitext, "NEW_FILENAME");
IupTextConvertPosToLinCol(multitext, pos_start, &lin, &col);
IupSetStrf(listSearch, "APPENDITEM", "%s(%d): %s", filename, lin + 1, IupGetAttributeId(multitext, "LINE", lin));
search_count = IupGetInt(listSearch, "COUNT");
IupSetStrAttributeId(listSearch, "FILENAME", search_count, filename);
IupSetIntId(listSearch, "LINE", search_count, lin);
IupSetIntId(listSearch, "COL", search_count, col);
IupSetIntId(listSearch, "POSSTART", search_count, pos_start);
IupSetIntId(listSearch, "POSEND", search_count, pos_end);
}
static int item_new_blank_proj_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGLOAD_CB");
Ihandle* projectSplit = IupGetDialogChild(ih, "PROJECTSPLIT");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(ih);
if (projectConfig)
{
if (item_close_proj_action_cb(ih) == IUP_IGNORE)
return IUP_IGNORE;
}
projectConfig = IupConfig();
iupAttribSet(ih, "_IUP_PROJECT_CONFIG", (char*)projectConfig);
tree_project_clear(projectTree);
IupSetAttribute(projectTree, "TITLE0", "Untitled Project");
if (cb)
cb(ih, projectConfig);
if (IupGetInt(projectSplit, "VALUE") == 0)
{
IupSetAttribute(projectSplit, "VALUE", "200");
IupRefresh(ih);
}
return IUP_DEFAULT;
}
static int item_new_proj_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGLOAD_CB");
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
Ihandle* multitext;
char* filename;
Ihandle *config, *projectConfig;
if (item_new_blank_proj_action_cb(ih_item) == IUP_IGNORE)
return IUP_IGNORE;
config = iScintillaDlgGetConfig(ih_item);
projectConfig = iScintillaDlgGetProjectConfig(ih_item);
IupConfigCopy(config, projectConfig, "Scintilla"); /* do not copy "Scintilla" prefixed groups */
if (cb)
cb(ih, projectConfig);
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
filename = IupGetAttribute(multitext, "FILENAME");
if (!filename)
continue;
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
}
return IUP_DEFAULT;
}
static void loadProjectFiles(Ihandle *projectConfig, Ihandle *projectTree)
{
char *app_filename = IupGetAttribute(projectConfig, "APP_FILENAME");
const char *filename;
int count, i;
count = IupConfigGetVariableInt(projectConfig, "ProjectFiles", "Count");
for (i = 1; i <= count; i++)
{
filename = IupConfigGetVariableStrId(projectConfig, "ProjectFiles", "File", i);
filename = setProjectRelativeFilename(app_filename, filename);
if (!check_inproject(projectTree, filename))
addFileToProjectTree(projectTree, filename);
free((void*)filename);
}
count = IupConfigGetVariableInt(projectConfig, "ProjectOpenFiles", "Count");
for (i = 1; i <= count; i++)
{
filename = IupConfigGetVariableStrId(projectConfig, "ProjectOpenFiles", "File", i);
filename = setProjectRelativeFilename(app_filename, filename);
if (!check_open_revert(projectTree, filename))
open_file(projectTree, filename, 1);
free((void*)filename);
}
}
static int item_open_proj_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle *filedlg;
Ihandle* config;
const char* dir = NULL;
char* project_ext = IupGetAttribute(ih, "PROJECT_EXT");
if (!project_ext) project_ext = "prj";
config = iScintillaDlgGetConfig(ih_item);
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "OPEN");
IupSetStrf(filedlg, "EXTFILTER", "Project Files|*.%s|All Files|*.*|", project_ext);
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttribute(filedlg, "TITLE", "Open Project");
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
char* filename = IupGetAttribute(filedlg, "VALUE");
open_proj(ih, filename);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int item_save_proj_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(ih);
saveProject(ih, projectConfig, 0);
return IUP_DEFAULT;
}
static void saveProject(Ihandle *ih_item, Ihandle *projectConfig, int show_dialog)
{
IFnn cb;
char *filename = IupGetAttribute(projectConfig, "APP_FILENAME");
Ihandle* ih = IupGetDialog(ih_item);
if (!filename || show_dialog)
{
Ihandle *config = iScintillaDlgGetConfig(ih);
const char *dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
Ihandle *filedlg = IupFileDlg();
char* project_ext = IupGetAttribute(ih, "PROJECT_EXT");
if (!project_ext) project_ext = "prj";
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
IupSetStrf(filedlg, "EXTFILTER", "Project Files|*.%s|All Files|*.*|", project_ext);
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "FILE", filename);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupSetAttribute(filedlg, "TITLE", "Save Project As");
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
filename = get_filename_value(filedlg, project_ext);
IupSetStrAttribute(projectConfig, "APP_FILENAME", filename);
IupSetStrAttribute(projectTree, "TITLE0", strFileTitle(filename));
IupSetAttribute(config, "RECENTNAME", "ScintillaRecentProject");
IupConfigRecentUpdate(config, filename);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
else
return;
}
cb = (IFnn)IupGetCallback(ih, "CONFIGSAVE_CB");
if (cb)
cb(ih, projectConfig);
saveAllMarkers(ih, projectConfig);
saveProjectOpenFilesList(ih, projectConfig);
IupConfigSave(projectConfig);
IupSetAttribute(projectConfig, "MODIFIED", "NO");
}
static int item_save_proj_as_action_cb(Ihandle* ih_item)
{
Ihandle *projectConfig = iScintillaDlgGetProjectConfig(ih_item);
saveProject(ih_item, projectConfig, 1);
return IUP_DEFAULT;
}
static int item_close_proj_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGLOAD_CB");
Ihandle* projectSplit = IupGetDialogChild(ih, "PROJECTSPLIT");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
Ihandle *config = iScintillaDlgGetConfig(ih);
if (!save_project_check(ih))
return IUP_IGNORE;
item_closeall_action_cb(ih_item);
tree_project_clear(projectTree);
IupSetAttribute(projectTree, "TITLE0", "Untitled Project");
IupSetAttribute(projectSplit, "VALUE", "0");
IupDestroy(projectConfig);
iupAttribSet(ih, "_IUP_PROJECT_CONFIG", NULL);
if (cb)
cb(ih, config);
return IUP_DEFAULT;
}
static int item_add_new_file_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* config = iScintillaDlgGetConfig(ih_item);
const char *dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
Ihandle *filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
Ihandle* multitext;
Ihandle* projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
char* filename = get_filename_value(filedlg, IupGetAttribute(ih, "DEFAULT_EXT"));
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
multitext = iScintillaDlgNewMultitext(ih_item);
IupSetAttribute(multitext, "FILENAME", filename);
IupSetAttribute(multitext, "VALUE", ""); /* empty text */
IupSetAttribute(multitext, "SAVEPOINT", NULL); /* this will update title */
IupSetAttribute(multitext, "UNDO", NULL); /* clear undo */
save_file(multitext);
}
return IUP_DEFAULT;
}
static int item_add_exist_file_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle *filedlg;
Ihandle *config, *projectConfig;
const char* dir = NULL;
char* extra_filters = IupGetAttribute(ih, "EXTRAFILTERS");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
config = iScintillaDlgGetConfig(ih_item);
projectConfig = iScintillaDlgGetProjectConfig(ih_item);
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "OPEN");
if (extra_filters)
IupSetStrf(filedlg, "EXTFILTER", "%sText Files|*.txt|All Files|*.*|", extra_filters);
else
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
char* filename = IupGetAttribute(filedlg, "VALUE");
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int item_add_open_file_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih_item);
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
char* filename = IupGetAttribute(multitext, "FILENAME");
if (!check_inproject(projectTree, filename))
{
addFileToProjectTree(projectTree, filename);
IupSetAttribute(projectConfig, "MODIFIED", "YES");
}
return IUP_DEFAULT;
}
static int item_open_proj_file_action_cb(Ihandle* ih_item)
{
char* filename;
Ihandle* projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
int id = IupGetInt(projectTree, "VALUE");
if (id < 1)
return IUP_DEFAULT;
filename = IupTreeGetUserId(projectTree, id);
if (!check_open_revert(projectTree, filename))
open_file(projectTree, filename, 1);
return IUP_DEFAULT;
}
static int item_open_all_proj_file_action_cb(Ihandle* ih_item)
{
Ihandle* projectTree = IupGetDialogChild(ih_item, "PROJECTTREE");
int count = IupGetInt(projectTree, "CHILDCOUNT0");
int i;
for (i = 1; i <= count; i++)
{
char* filename = IupTreeGetUserId(projectTree, i);
if (!check_open_revert(projectTree, filename))
open_file(projectTree, filename, 1);
}
return IUP_DEFAULT;
}
static int item_remove_proj_file_action_cb(Ihandle* ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
int id = IupGetInt(projectTree, "VALUE");
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
removeFileFromProject(projectConfig, projectTree, id);
return IUP_DEFAULT;
}
static int item_loadsession_action_cb(Ihandle *ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
const char* dir;
Ihandle* config;
Ihandle *filedlg;
config = iScintillaDlgGetConfig(ih_item);
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "OPEN");
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
char* filename = IupGetAttribute(filedlg, "VALUE");
IlineFile* line_file = iupLineFileOpen(filename);
if (!line_file)
{
IupMessageError(ih, "IUP_ERRORFILEOPEN");
return IUP_DEFAULT;
}
do
{
const char* line_buffer;
int line_len = iupLineFileReadLine(line_file);
if (line_len == -1)
break;
line_buffer = iupLineFileGetBuffer(line_file);
if (!check_open_revert(ih, line_buffer))
open_file(ih_item, line_buffer, 1);
} while (!iupLineFileEOF(line_file));
iupLineFileClose(line_file);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
return IUP_DEFAULT;
}
static int item_savesession_action_cb(Ihandle *ih_item)
{
Ihandle* ih = IupGetDialog(ih_item);
const char* dir;
Ihandle* config;
Ihandle *filedlg;
config = iScintillaDlgGetConfig(ih_item);
dir = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory");
filedlg = IupFileDlg();
IupSetAttribute(filedlg, "DIALOGTYPE", "SAVE");
IupSetAttribute(filedlg, "EXTFILTER", "Text Files|*.txt|All Files|*.*|");
IupSetAttributeHandle(filedlg, "PARENTDIALOG", ih);
IupSetStrAttribute(filedlg, "DIRECTORY", dir);
IupPopup(filedlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(filedlg, "STATUS") != -1)
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
char* filename = IupGetAttribute(filedlg, "VALUE");
int i, count = IupGetChildCount(tabs);
FILE* file = fopen(filename, "wb");
if (!file)
{
IupMessageError(ih, "IUP_ERRORFILESAVE");
return IUP_DEFAULT;
}
for (i = 0; i < count; i++)
{
Ihandle* multitext = IupGetChild(tabs, i);
char* m_filename = IupGetAttribute(multitext, "FILENAME");
if (m_filename && IupGetInt(multitext, "COUNT") > 0)
{
if (i > 0)
fprintf(file, "\n");
fprintf(file, "%s", m_filename);
}
}
fclose(file);
dir = IupGetAttribute(filedlg, "DIRECTORY");
IupConfigSetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "LastDirectory", dir);
}
IupDestroy(filedlg);
return IUP_DEFAULT;
}
static int show_cb(Ihandle* ih, int state)
{
if (state == IUP_HIDE && !iupAttribGet(ih, "_IUP_CLOSING"))
close_exit_action_cb(ih);
return IUP_DEFAULT;
}
static int goto_ok_action_cb(Ihandle* bt_ok)
{
int line_count = IupGetInt(bt_ok, "TEXT_LINECOUNT");
Ihandle* txt = IupGetDialogChild(bt_ok, "LINE_TEXT");
int line = IupGetInt(txt, "VALUE");
if (line < 1 || line > line_count)
{
IupMessageError(IupGetDialog(bt_ok), "Invalid line number.");
return IUP_DEFAULT;
}
IupSetAttribute(IupGetDialog(bt_ok), "STATUS", "1");
return IUP_CLOSE;
}
static int goto_cancel_action_cb(Ihandle* bt_ok)
{
IupSetAttribute(IupGetDialog(bt_ok), "STATUS", "0");
return IUP_CLOSE;
}
static int item_goto_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle *goto_dlg, *box, *bt_ok, *bt_cancel, *txt, *lbl;
int line_count = IupGetInt(multitext, "LINECOUNT");
lbl = IupLabel(NULL);
IupSetfAttribute(lbl, "TITLE", "Line Number [1-%d]:", line_count);
txt = IupText(NULL);
IupSetAttribute(txt, "MASK", IUP_MASK_UINT); /* unsigned integer numbers only */
IupSetAttribute(txt, "NAME", "LINE_TEXT");
IupSetAttribute(txt, "VISIBLECOLUMNS", "20");
bt_ok = IupButton("OK", NULL);
IupSetInt(bt_ok, "TEXT_LINECOUNT", line_count);
IupSetAttribute(bt_ok, "PADDING", "10x2");
IupSetCallback(bt_ok, "ACTION", (Icallback)goto_ok_action_cb);
bt_cancel = IupButton("Cancel", NULL);
IupSetCallback(bt_cancel, "ACTION", (Icallback)goto_cancel_action_cb);
IupSetAttribute(bt_cancel, "PADDING", "10x2");
box = IupVbox(
lbl,
txt,
IupSetAttributes(IupHbox(
IupFill(),
bt_ok,
bt_cancel,
NULL), "NORMALIZESIZE=HORIZONTAL"),
NULL);
IupSetAttribute(box, "MARGIN", "10x10");
IupSetAttribute(box, "GAP", "5");
goto_dlg = IupDialog(box);
IupSetAttribute(goto_dlg, "TITLE", "Go To Line");
IupSetAttribute(goto_dlg, "DIALOGFRAME", "Yes");
IupSetAttributeHandle(goto_dlg, "DEFAULTENTER", bt_ok);
IupSetAttributeHandle(goto_dlg, "DEFAULTESC", bt_cancel);
IupSetAttributeHandle(goto_dlg, "PARENTDIALOG", IupGetDialog(ih_item));
IupPopup(goto_dlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(goto_dlg, "STATUS") == 1)
{
int line = IupGetInt(txt, "VALUE");
int pos;
IupTextConvertLinColToPos(multitext, line - 1, 0, &pos); /* in Scintilla lin and col start at 0 */
IupSetAttributeId(multitext, "ENSUREVISIBLE", line - 1, NULL);
IupSetInt(multitext, "CARETPOS", pos);
IupSetInt(multitext, "SCROLLTOPOS", pos);
}
IupDestroy(goto_dlg);
return IUP_DEFAULT;
}
static int item_gotombrace_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
int pos = IupGetInt(multitext, "CARETPOS");
int newpos = IupGetIntId(multitext, "BRACEMATCH", pos);
if (newpos != -1)
{
IupSetStrf(multitext, "BRACEHIGHLIGHT", "%d:%d", pos, newpos);
IupSetInt(multitext, "CARETPOS", newpos);
IupSetInt(multitext, "SCROLLTOPOS", newpos);
}
return IUP_IGNORE;
}
static int item_togglemark_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
int pos = IupGetInt(multitext, "CARETPOS");
int lin, col;
IupTextConvertPosToLinCol(multitext, pos, &lin, &col);
toggleMarker(multitext, lin, 1);
return IUP_IGNORE;
}
static int item_nextmark_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
int pos = IupGetInt(multitext, "CARETPOS");
int lin, col;
IupTextConvertPosToLinCol(multitext, pos, &lin, &col);
IupSetAttributeId(multitext, "MARKERNEXT", lin + 1, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin == -1)
return IUP_IGNORE;
IupTextConvertLinColToPos(multitext, lin, 0, &pos);
IupSetInt(multitext, "CARETPOS", pos);
return IUP_DEFAULT;
}
static int item_previousmark_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
int pos = IupGetInt(multitext, "CARETPOS");
int lin, col;
IupTextConvertPosToLinCol(multitext, pos, &lin, &col);
IupSetAttributeId(multitext, "MARKERPREVIOUS", lin - 1, "1"); /* 0001 - marker=0 */
lin = IupGetInt(multitext, "LASTMARKERFOUND");
if (lin == -1)
return IUP_IGNORE;
IupTextConvertLinColToPos(multitext, lin, 0, &pos);
IupSetInt(multitext, "CARETPOS", pos);
return IUP_DEFAULT;
}
static int item_clearmarks_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
removeAllBookmark(multitext);
return IUP_DEFAULT;
}
static int item_copymarked_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
copyMarkedLines(multitext);
return IUP_DEFAULT;
}
static int item_cutmarked_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
cutMarkedLines(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_pastetomarked_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
pasteToMarkedLines(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_removemarked_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
removeMarkedLines(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_invertmarks_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
invertMarkedLines(multitext);
return IUP_DEFAULT;
}
static int item_eoltospace_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
changeEolToSpace(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_eol_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
char* eol = iupAttribGet(ih_item, "EOL");
IupSetStrAttribute(multitext, "EOLMODE", eol);
IupSetStrAttribute(multitext, "FIXEOL", eol);
return IUP_DEFAULT;
}
static int item_removespaceeol_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
removeTrailingSpaces(multitext);
removeLeadingSpaces(multitext);
changeEolToSpace(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_trimtrailing_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
removeTrailingSpaces(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_trimleading_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
removeLeadingSpaces(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_trimtraillead_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
removeTrailingSpaces(multitext);
removeLeadingSpaces(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_tabtospace_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
changeTabsToSpaces(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_allspacetotab_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
changeSpacesToTabs(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int item_leadingspacetotab_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
changeLeadingSpacesToTabs(multitext);
IupSetAttribute(multitext, "UNDOACTION", "END");
return IUP_DEFAULT;
}
static int lst_search_in_action_cb(Ihandle* ih, char *text, int item, int state)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih, "FIND_DIALOG");
Ihandle* dirMode = IupGetDialogChild(find_dlg, "DIRECTION_RADIO");
Ihandle* wrap = IupGetDialogChild(find_dlg, "WRAP");
IupSetAttribute(dirMode, "VALUE_HANDLE", (char*)IupGetDialogChild(find_dlg, "DOWN"));
IupSetAttribute(wrap, "VALUE", "OFF");
if (item == 2 && state == 1)
{
IupSetAttribute(dirMode, "ACTIVE", "NO");
IupSetAttribute(wrap, "ACTIVE", "NO");
}
else
{
IupSetAttribute(dirMode, "ACTIVE", "YES");
IupSetAttribute(wrap, "ACTIVE", "YES");
}
(void)text;
return IUP_DEFAULT;
}
static int find_next_action_cb(Ihandle* ih_item)
{
/* this callback can be called from the main dialog also */
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih_item, "FIND_DIALOG");
if (find_dlg)
{
char* str_to_find;
Ihandle* ih = IupGetAttributeHandle(find_dlg, "PARENTDIALOG");
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle* sciDummy = IupGetDialogChild(find_dlg, "SCI_DUMMY");
Ihandle* find_txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
int count = IupGetInt(tabs, "COUNT");
int find_start, find_end;
int found = 0;
int i;
/* test again, because it can be called from the hot key */
str_to_find = IupGetAttribute(find_txt, "VALUE");
if (str_to_find && str_to_find[0] != 0)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
int searchIn = IupGetInt(IupGetDialogChild(find_dlg, "LST_SEARCH_IN"), "VALUE");
int wrap = IupGetInt(IupGetDialogChild(find_dlg, "WRAP"), "VALUE");
int down = IupGetInt(IupGetDialogChild(find_dlg, "DOWN"), "VALUE");
int casesensitive = IupGetInt(IupGetDialogChild(find_dlg, "FIND_CASE"), "VALUE");
int whole_word = IupGetInt(IupGetDialogChild(find_dlg, "WHOLE_WORD"), "VALUE");
int regexp = IupGetInt(IupGetDialogChild(find_dlg, "REG_EXP"), "VALUE");
int posix = IupGetInt(IupGetDialogChild(find_dlg, "POSIX"), "VALUE");
if (!down && IupGetAttribute(multitext, "SELECTIONPOS"))
{
int st, ed;
IupGetIntInt(multitext, "SELECTIONPOS", &st, &ed);
find_start = st;
}
else
find_start = IupGetInt(multitext, "CARETPOS");
find_end = down ? IupGetInt(multitext, "COUNT") : 0;
if (searchIn == 1)
count = 1;
for (i = 0; i < count; i++)
{
found = searchInFile(multitext, find_txt, find_start, find_end, wrap, down, casesensitive, whole_word, regexp, posix);
if (found)
{
if ((Ihandle*)IupGetAttribute(tabs, "VALUE_HANDLE") != multitext)
IupSetAttribute(tabs, "VALUE_HANDLE", (char *)multitext);
break;
}
if (multitext->brother)
multitext = multitext->brother;
else
multitext = tabs->firstchild;
find_start = 0;
find_end = IupGetInt(multitext, "COUNT");
}
if (searchIn == 3)
{
count = IupGetInt(projectTree, "CHILDCOUNT0");
for (i = 1; i <= count; i++)
{
char* str;
char* filename = IupTreeGetUserId(projectTree, i);
if (check_open_revert(projectTree, filename))
continue;
str = readFile(filename);
if (str)
{
int st1, ed1, st2, ed2;
IupSetStrAttribute(sciDummy, "FILENAME", filename);
IupSetStrAttribute(sciDummy, "VALUE", str);
st1 = 0;
ed1 = IupGetInt(sciDummy, "COUNT");
IupSetInt(sciDummy, "TARGETSTART", st1);
IupSetInt(sciDummy, "TARGETEND", ed1);
IupSetAttribute(sciDummy, "SEARCHINTARGET", str_to_find);
st2 = IupGetInt(sciDummy, "TARGETSTART");
ed2 = IupGetInt(sciDummy, "TARGETEND");
if (st2 == st1 && ed2 == ed1)
continue;
}
open_file(projectTree, filename, 1);
multitext = iScintillaDlgGetCurrentMultitext(ih);
found = searchInFile(multitext, find_txt, 0, IupGetInt(sciDummy, "COUNT"), wrap, down, casesensitive, whole_word, regexp, posix);
if (found)
{
if ((Ihandle*)IupGetAttribute(tabs, "VALUE_HANDLE") != multitext)
IupSetAttribute(tabs, "VALUE_HANDLE", (char *)multitext);
break;
}
}
}
if (!found)
{
/* update statusbar */
Ihandle *statusbar = IupGetDialogChild(ih, "STATUSBAR");
IupSetfAttribute(statusbar, "TITLE", "Text \"%s\" not found.", str_to_find);
}
}
}
return IUP_DEFAULT;
}
static int find_replace_action_cb(Ihandle* bt_replace)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(bt_replace, "FIND_DIALOG");
Ihandle* ih = IupGetAttributeHandle(find_dlg, "PARENTDIALOG");
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
char* selectionpos = IupGetAttribute(multitext, "SELECTIONPOS");
if (!selectionpos)
find_next_action_cb(bt_replace);
else
{
Ihandle* replace_txt = IupGetDialogChild(find_dlg, "REPLACE_TEXT");
char* str_to_replace = IupGetAttribute(replace_txt, "VALUE");
if (IupGetAttribute(multitext, "SELECTIONPOS"))
{
int init, fim;
IupGetIntInt(multitext, "SELECTIONPOS", &init, &fim);
IupSetInt(multitext, "TARGETSTART", init);
IupSetInt(multitext, "TARGETEND", fim);
IupSetAttribute(multitext, "REPLACETARGET", str_to_replace);
}
/* then find next */
find_next_action_cb(bt_replace);
}
return IUP_DEFAULT;
}
static int find_all_action_cb(Ihandle* bt_replace)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(bt_replace, "FIND_DIALOG");
if (find_dlg)
{
Ihandle* find_txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
/* test again, because it can be called from the hot key */
char* str_to_find = IupGetAttribute(find_txt, "VALUE");
if (str_to_find && str_to_find[0] != 0)
{
char flags[80];
int find_start, find_end;
int pos_start, pos_end;
int i, count, find_count = 0, find_files_count = 0, file_first;
Ihandle* ih = IupGetAttributeHandle(find_dlg, "PARENTDIALOG");
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* projectTree = IupGetDialogChild(ih, "PROJECTTREE");
Ihandle* panelTabs = IupGetDialogChild(ih, "PANEL_TABS");
Ihandle* listSearch = IupGetDialogChild(ih, "LIST_SEARCH");
Ihandle* currentMultitext = iScintillaDlgGetCurrentMultitext(ih);
Ihandle* multitext = NULL;
char options[80] = "";
int searchIn = IupGetInt(IupGetDialogChild(find_dlg, "LST_SEARCH_IN"), "VALUE");
int casesensitive = IupGetInt(IupGetDialogChild(find_dlg, "FIND_CASE"), "VALUE");
int whole_word = IupGetInt(IupGetDialogChild(find_dlg, "WHOLE_WORD"), "VALUE");
int regexp = IupGetInt(IupGetDialogChild(find_dlg, "REG_EXP"), "VALUE");
int posix = IupGetInt(IupGetDialogChild(find_dlg, "POSIX"), "VALUE");
IupSetAttribute(listSearch, "REMOVEITEM", "ALL");
IupSetAttribute(panelTabs, "VALUEPOS", "0");
flags[0] = 0;
if (casesensitive)
{
strcpy(flags, "MATCHCASE");
strcat(options, "Match Case");
}
if (whole_word)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "WHOLEWORD");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Whole Word");
}
if (regexp)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "REGEXP");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Reg. Expression");
}
if (posix)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "POSIX");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Posix Reg. Expression");
}
if (options[0]==0)
strcat(options, "no");
IupSetStrf(listSearch, "APPENDITEM", "Searching for: \"%s\", in (%s) with [%s] options", str_to_find, searchIn == 1 ? "Current Document" : (searchIn == 2 ? "All Open Documents" : "Project Documents"), options);
if (searchIn == 1)
count = 1;
else if (searchIn == 2)
count = IupGetInt(tabs, "COUNT");
else
count = IupGetIntId(projectTree, "CHILDCOUNT", 0);
for (i = 0; i < count; i++)
{
file_first = 1;
if (searchIn == 1)
multitext = currentMultitext;
else if (searchIn == 2)
multitext = IupGetChild(tabs, i);
else
{
char *filename = IupTreeGetUserId(projectTree, i+1);
char* str = readFile(filename);
if (str)
{
multitext = IupGetDialogChild(find_dlg, "SCI_DUMMY");
IupSetStrAttribute(multitext, "FILENAME", filename);
IupSetStrAttribute(multitext, "VALUE", str);
}
}
if (flags[0] != 0)
IupSetAttribute(multitext, "SEARCHFLAGS", flags);
else
IupSetAttribute(multitext, "SEARCHFLAGS", NULL);
find_start = 0;
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
while (find_start != pos_start || find_end != pos_end)
{
list_search_add(listSearch, multitext, pos_start, pos_end);
find_start = IupGetInt(multitext, "TARGETEND");
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
find_count++;
if (file_first)
{
find_files_count++;
file_first = 0;
}
}
if (multitext->brother)
multitext = multitext->brother;
else
multitext = tabs->firstchild;
}
IupSetStrf(listSearch, "APPENDITEM", "Found %d results, in %d documents.", find_count, find_files_count);
}
}
return IUP_DEFAULT;
}
static int find_replace_all_action_cb(Ihandle* bt_replace)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(bt_replace, "FIND_DIALOG");
if (find_dlg)
{
Ihandle* find_txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
/* test again, because it can be called from the hot key */
char* str_to_find = IupGetAttribute(find_txt, "VALUE");
if (str_to_find && str_to_find[0] != 0)
{
int find_start, find_end;
int pos_start, pos_end;
char* str_to_replace;
int i, count, find_count = 0, find_files_count = 0, file_first;
char flags[80];
Ihandle* ih = IupGetAttributeHandle(find_dlg, "PARENTDIALOG");
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* currentMultitext = iScintillaDlgGetCurrentMultitext(ih);
Ihandle* multitext = currentMultitext;
Ihandle* replace_txt = IupGetDialogChild(find_dlg, "REPLACE_TEXT");
Ihandle* panelTabs = IupGetDialogChild(ih, "PANEL_TABS");
Ihandle* listSearch = IupGetDialogChild(ih, "LIST_SEARCH");
char options[80] = "";
int searchIn = IupGetInt(IupGetDialogChild(find_dlg, "LST_SEARCH_IN"), "VALUE");
int casesensitive = IupGetInt(IupGetDialogChild(find_dlg, "FIND_CASE"), "VALUE");
int whole_word = IupGetInt(IupGetDialogChild(find_dlg, "WHOLE_WORD"), "VALUE");
int regexp = IupGetInt(IupGetDialogChild(find_dlg, "REG_EXP"), "VALUE");
int posix = IupGetInt(IupGetDialogChild(find_dlg, "POSIX"), "VALUE");
IupSetAttribute(listSearch, "REMOVEITEM", "ALL");
IupSetAttribute(panelTabs, "VALUEPOS", "0");
flags[0] = 0;
if (casesensitive)
{
strcpy(flags, "MATCHCASE");
strcat(options, "Match Case");
}
if (whole_word)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "WHOLEWORD");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Whole Word");
}
if (regexp)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "REGEXP");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Reg. Expression");
}
if (posix)
{
strcat((flags[0] != 0 ? strcat(flags, " | ") : flags), "POSIX");
if (options[0] != 0) strcat(options, ",");
strcat(options, "Posix Reg. Expression");
}
if (options[0] == 0)
strcat(options, "no");
str_to_replace = IupGetAttribute(replace_txt, "VALUE");
/* replace all does NOT replace on Project Documents */
IupSetStrf(listSearch, "APPENDITEM", "Searching for: \"%s\" and Replacing by: \"%s\", in (%s) with [%s] options", str_to_find, str_to_replace, searchIn == 1 ? "Current Document" : "All Open Documents", options);
if (searchIn == 1)
count = 1;
else
count = IupGetInt(tabs, "COUNT");
for (i = 0; i < count; i++)
{
file_first = 1;
if (flags[0] != 0)
IupSetAttribute(multitext, "SEARCHFLAGS", flags);
else
IupSetAttribute(multitext, "SEARCHFLAGS", NULL);
find_start = 0;
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
IupSetAttribute(multitext, "UNDOACTION", "BEGIN");
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
while (find_start != pos_start || find_end != pos_end)
{
list_search_add(listSearch, multitext, pos_start, pos_end);
str_to_replace = IupGetAttribute(replace_txt, "VALUE");
IupSetAttribute(multitext, "REPLACETARGET", str_to_replace);
find_start = IupGetInt(multitext, "TARGETEND");
find_end = IupGetInt(multitext, "COUNT");
IupSetInt(multitext, "TARGETSTART", find_start);
IupSetInt(multitext, "TARGETEND", find_end);
str_to_find = IupGetAttribute(find_txt, "VALUE");
IupSetAttribute(multitext, "SEARCHINTARGET", str_to_find);
pos_start = IupGetInt(multitext, "TARGETSTART");
pos_end = IupGetInt(multitext, "TARGETEND");
find_count++;
if (file_first)
{
find_files_count++;
file_first = 0;
}
}
IupSetAttribute(multitext, "UNDOACTION", "END");
if (multitext->brother)
multitext = multitext->brother;
else
multitext = tabs->firstchild;
}
IupSetStrf(listSearch, "APPENDITEM", "Replaced %d results, in %d documents.", find_count, find_files_count);
}
}
return IUP_DEFAULT;
}
static int find_close_action_cb(Ihandle* bt_close)
{
Ihandle* find_dlg = IupGetDialog(bt_close);
Ihandle* find_text = IupGetDialogChild(find_dlg, "FIND_TEXT");
Ihandle* replace_text = IupGetDialogChild(find_dlg, "REPLACE_TEXT");
Ihandle* find_case = IupGetDialogChild(find_dlg, "FIND_CASE");
Ihandle* whole_word = IupGetDialogChild(find_dlg, "WHOLE_WORD");
Ihandle* wrap = IupGetDialogChild(find_dlg, "WRAP");
Ihandle* searchMode = IupGetDialogChild(find_dlg, "SEARCH_RADIO");
Ihandle* dirMode = IupGetDialogChild(find_dlg, "DIRECTION_RADIO");
Ihandle* ih = IupGetAttributeHandle(find_dlg, "PARENTDIALOG");
Ihandle* config = iScintillaDlgGetConfig(ih);
IupConfigSetVariableStr(config, "ScintillaFind", "FindText", IupGetAttribute(find_text, "VALUE"));
IupConfigSetVariableStr(config, "ScintillaFind", "ReplaceText", IupGetAttribute(replace_text, "VALUE"));
IupConfigSetVariableStr(config, "ScintillaFind", "FindCase", IupGetAttribute(find_case, "VALUE"));
IupConfigSetVariableStr(config, "ScintillaFind", "WholeWord", IupGetAttribute(whole_word, "VALUE"));
IupConfigSetVariableStr(config, "ScintillaFind", "Wrap", IupGetAttribute(wrap, "VALUE"));
IupConfigSetVariableStr(config, "ScintillaFind", "SearchMode", IupGetAttribute((Ihandle*)IupGetAttribute(searchMode, "VALUE_HANDLE"), "NAME"));
IupConfigSetVariableStr(config, "ScintillaFind", "SearchDir", IupGetAttribute((Ihandle*)IupGetAttribute(dirMode, "VALUE_HANDLE"), "NAME"));
IupConfigDialogClosed(config, find_dlg, "ScintillaFind");
IupHide(find_dlg); /* do not destroy, just hide */
return IUP_DEFAULT;
}
static Ihandle* create_find_dialog(Ihandle* ih_item)
{
Ihandle *box, *bt_next, *bt_findall, *bt_close, *txt, *lst_search_in, *find_dlg;
Ihandle *find_case, *whole_word, *mode, *normal, *reg_exp, *posix, *wrap, *up, *down;
Ihandle *flags, *direction, *searchRadio, *directionRadio;
Ihandle *txt_replace, *bt_replace, *bt_replace_all;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
Ihandle *sci_dummy;
const char* value;
txt = IupText(NULL);
IupSetAttribute(txt, "NAME", "FIND_TEXT");
IupSetAttribute(txt, "EXPAND", "HORIZONTAL");
txt_replace = IupText(NULL);
IupSetAttribute(txt_replace, "NAME", "REPLACE_TEXT");
IupSetAttribute(txt_replace, "EXPAND", "HORIZONTAL");
lst_search_in = IupList(NULL);
IupSetAttribute(lst_search_in, "NAME", "LST_SEARCH_IN");
IupSetAttribute(lst_search_in, "EXPAND", "HORIZONTAL");
IupSetAttribute(lst_search_in, "DROPDOWN", "YES");
IupSetAttribute(lst_search_in, "1", "Current Document");
IupSetAttribute(lst_search_in, "2", "All Open Documents");
IupSetAttribute(lst_search_in, "VALUE", "1");
IupSetCallback(lst_search_in, "ACTION", (Icallback)lst_search_in_action_cb);
find_case = IupToggle("Match Case", NULL);
IupSetAttribute(find_case, "NAME", "FIND_CASE");
whole_word = IupToggle("Match Whole Word", NULL);
IupSetAttribute(whole_word, "NAME", "WHOLE_WORD");
normal = IupToggle("Normal", NULL);
IupSetAttribute(normal, "NAME", "NORMAL");
reg_exp = IupToggle("Reg. Expression", NULL);
IupSetAttribute(reg_exp, "NAME", "REG_EXP");
posix = IupToggle("Posix Reg. Expr.", NULL);
IupSetAttribute(posix, "NAME", "POSIX");
wrap = IupToggle("Wrap Around", NULL);
IupSetAttribute(wrap, "NAME", "WRAP");
up = IupToggle("Up", NULL);
IupSetAttribute(up, "NAME", "UP");
down = IupToggle("Down", NULL);
IupSetAttribute(down, "NAME", "DOWN");
bt_next = IupButton("Find Next", NULL);
IupSetAttribute(bt_next, "PADDING", "10x2");
IupSetCallback(bt_next, "ACTION", (Icallback)find_next_action_cb);
bt_findall = IupButton("Find All", NULL);
IupSetAttribute(bt_findall, "PADDING", "10x2");
IupSetCallback(bt_findall, "ACTION", (Icallback)find_all_action_cb);
bt_replace = IupButton("Replace", NULL);
IupSetAttribute(bt_replace, "PADDING", "10x2");
IupSetCallback(bt_replace, "ACTION", (Icallback)find_replace_action_cb);
IupSetAttribute(bt_replace, "NAME", "REPLACE_BUTTON");
bt_replace_all = IupButton("Replace All", NULL);
IupSetAttribute(bt_replace_all, "PADDING", "10x2");
IupSetCallback(bt_replace_all, "ACTION", (Icallback)find_replace_all_action_cb);
IupSetAttribute(bt_replace_all, "NAME", "REPLACE_ALL_BUTTON");
bt_close = IupButton("Close", NULL);
IupSetCallback(bt_close, "ACTION", (Icallback)find_close_action_cb);
IupSetAttribute(bt_close, "PADDING", "10x2");
flags = IupVbox(find_case,
whole_word,
wrap,
NULL);
searchRadio = IupRadio(IupVbox(normal, reg_exp, posix, NULL));
IupSetAttribute(searchRadio, "MARGIN", "10x10");
IupSetAttribute(searchRadio, "VALUE_HANDLE", (char*)normal);
IupSetAttribute(searchRadio, "NAME", "SEARCH_RADIO");
mode = IupFrame(searchRadio);
IupSetAttribute(mode, "TITLE", "Search Mode");
directionRadio = IupRadio(IupVbox(up, down, NULL));
IupSetAttribute(directionRadio, "MARGIN", "10x10");
IupSetAttribute(directionRadio, "VALUE_HANDLE", (char*)down);
IupSetAttribute(directionRadio, "NAME", "DIRECTION_RADIO");
direction = IupFrame(directionRadio);
IupSetAttribute(direction, "TITLE", "Direction");
box = IupVbox(
IupLabel("Find What:"),
txt,
IupSetAttributes(IupLabel("Replace with:"), "NAME=REPLACE_LABEL"),
txt_replace,
IupLabel("Search in:"),
lst_search_in,
IupHbox(
flags,
direction,
mode,
NULL),
IupSetAttributes(IupLabel(NULL), "SEPARATOR=HORIZONTAL"),
IupSetAttributes(IupHbox(
IupFill(),
bt_next,
bt_findall,
bt_replace,
bt_replace_all,
bt_close,
NULL), "NORMALIZESIZE=HORIZONTAL"),
NULL);
IupSetAttribute(box, "NMARGIN", "10x10");
IupSetAttribute(box, "GAP", "10");
sci_dummy = IupScintilla();
IupSetAttribute(sci_dummy, "NAME", "SCI_DUMMY");
IupSetAttribute(sci_dummy, "VISIBLE", "NO");
IupSetAttribute(sci_dummy, "EXPAND", "NO");
find_dlg = IupDialog(IupZbox(box, sci_dummy, NULL));
IupSetAttribute(find_dlg, "TITLE", "Find");
IupSetAttribute(find_dlg, "DIALOGFRAME", "Yes");
IupSetAttributeHandle(find_dlg, "DEFAULTENTER", bt_next);
IupSetAttributeHandle(find_dlg, "DEFAULTESC", bt_close);
IupSetAttributeHandle(find_dlg, "PARENTDIALOG", IupGetDialog(ih_item));
IupSetCallback(find_dlg, "CLOSE_CB", (Icallback)find_close_action_cb);
/* Save the dialog to reuse it */
IupSetAttribute(find_dlg, "FIND_DIALOG", (char*)find_dlg); /* from itself */
IupSetAttribute(IupGetDialog(ih_item), "FIND_DIALOG", (char*)find_dlg); /* from the main dialog */
IupMap(find_dlg);
value = IupConfigGetVariableStr(config, "ScintillaFind", "FindText");
if (value)
IupSetStrAttribute(txt, "VALUE", value);
value = IupConfigGetVariableStr(config, "ScintillaFind", "ReplaceText");
if (value)
IupSetStrAttribute(txt_replace, "VALUE", value);
value = IupConfigGetVariableStr(config, "ScintillaFind", "FindCase");
if (value)
IupSetStrAttribute(find_case, "VALUE", value);
value = IupConfigGetVariableStr(config, "ScintillaFind", "WholeWord");
if (value)
IupSetStrAttribute(whole_word, "VALUE", value);
value = IupConfigGetVariableStr(config, "ScintillaFind", "Wrap");
if (value)
IupSetStrAttribute(wrap, "VALUE", value);
value = IupConfigGetVariableStr(config, "ScintillaFind", "SearchMode");
if (value)
{
Ihandle* search_mode = IupGetDialogChild(find_dlg, value);
if (search_mode)
IupSetAttribute(searchRadio, "VALUE_HANDLE", (char*)search_mode);
}
value = IupConfigGetVariableStr(config, "ScintillaFind", "SearchDir");
if (value)
{
Ihandle* search_dir = IupGetDialogChild(find_dlg, value);
if (search_dir)
IupSetAttribute(directionRadio, "VALUE_HANDLE", (char*)search_dir);
}
return find_dlg;
}
static int item_find_action_cb(Ihandle* ih_item)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih_item, "FIND_DIALOG");
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(ih_item);
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih_item);
Ihandle* searchIn = NULL;
char* str;
if (!find_dlg)
find_dlg = create_find_dialog(ih_item);
searchIn = IupGetDialogChild(find_dlg, "LST_SEARCH_IN");
if (projectConfig)
IupSetAttribute(searchIn, "3", "Project Documents");
else
IupSetAttribute(searchIn, "3", NULL);
set_find_replace_visibility(find_dlg, 0);
IupConfigDialogShow(config, find_dlg, "ScintillaFind");
str = IupGetAttribute(multitext, "SELECTEDTEXT");
if (str && str[0] != 0)
{
Ihandle* txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
IupSetStrAttribute(txt, "VALUE", str);
}
return IUP_DEFAULT;
}
static int item_replace_action_cb(Ihandle* ih_item)
{
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih_item, "FIND_DIALOG");
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char* str;
if (!find_dlg)
find_dlg = create_find_dialog(ih_item);
set_find_replace_visibility(find_dlg, 1);
IupConfigDialogShow(config, find_dlg, "ScintillaFind");
str = IupGetAttribute(multitext, "SELECTEDTEXT");
if (str && str[0] != 0)
{
Ihandle* txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
IupSetStrAttribute(txt, "VALUE", str);
}
return IUP_IGNORE; /* replace system processing for the hot key */
}
static int selection_find_next_action_cb(Ihandle* ih)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
char* str = IupGetAttribute(multitext, "SELECTEDTEXT");
if (str && str[0] != 0)
{
Ihandle* txt;
Ihandle* find_dlg = (Ihandle*)IupGetAttribute(ih, "FIND_DIALOG");
if (!find_dlg)
find_dlg = create_find_dialog(multitext);
txt = IupGetDialogChild(find_dlg, "FIND_TEXT");
IupSetStrAttribute(txt, "VALUE", str);
find_next_action_cb(ih);
}
return IUP_DEFAULT;
}
static int item_copy_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "CLIPBOARD", "COPY");
return IUP_DEFAULT;
}
static int item_paste_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "CLIPBOARD", "PASTE");
return IUP_IGNORE; /* replace system processing for the hot key, to correctly parse line feed */
}
static int item_cut_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "CLIPBOARD", "CUT");
return IUP_DEFAULT;
}
static int item_delete_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "CLIPBOARD", "CLEAR");
return IUP_DEFAULT;
}
static int item_select_all_action_cb(Ihandle* ih_item)
{
int count;
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetFocus(multitext);
count = IupGetInt(multitext, "COUNT");
IupSetStrf(multitext, "SELECTIONPOS", "%d:%d", 0, count - 1);
return IUP_DEFAULT;
}
static int item_undo_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDO", "YES");
return IUP_DEFAULT;
}
static int item_redo_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "REDO", "YES");
return IUP_DEFAULT;
}
static int item_undo_all_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "UNDO", "ALL");
return IUP_DEFAULT;
}
static int item_uppercase_action_cb(Ihandle* ih_item)
{
char *text;
int start, end;
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupGetIntInt(multitext, "SELECTIONPOS", &start, &end);
text = IupGetAttribute(multitext, "SELECTEDTEXT");
text = iupStrDup(text);
iupStrUpper(text, text);
IupSetAttribute(multitext, "SELECTEDTEXT", text);
IupSetStrf(multitext, "SELECTIONPOS", "%d:%d", start, end);
free(text);
return IUP_DEFAULT;
}
static int item_lowercase_action_cb(Ihandle* ih_item)
{
char *text;
int start, end;
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupGetIntInt(multitext, "SELECTIONPOS", &start, &end);
text = IupGetAttribute(multitext, "SELECTEDTEXT");
text = iupStrDup(text);
iupStrLower(text, text);
IupSetAttribute(multitext, "SELECTEDTEXT", text);
IupSetStrf(multitext, "SELECTIONPOS", "%d:%d", start, end);
free(text);
return IUP_DEFAULT;
}
static int item_case_action_cb(Ihandle* ih_item)
{
char* shift = IupGetGlobal("SHIFTKEY");
if (strcmp(shift, "ON") == 0)
item_uppercase_action_cb(ih_item);
else
item_lowercase_action_cb(ih_item);
return IUP_DEFAULT;
}
static int item_font_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
Ihandle* fontdlg = IupFontDlg();
const char* font = IupConfigGetVariableStr(config, "ScintillaFormat", "Font");
IupSetStrAttribute(fontdlg, "VALUE", font);
IupSetAttributeHandle(fontdlg, "PARENTDIALOG", IupGetDialog(ih_item));
IupPopup(fontdlg, IUP_CENTERPARENT, IUP_CENTERPARENT);
if (IupGetInt(fontdlg, "STATUS") == 1)
{
font = IupGetAttribute(fontdlg, "VALUE");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
IupSetStrAttribute(multitext, "FONT", font);
IupConfigSetVariableStr(config, "ScintillaFormat", "Font", font);
}
IupDestroy(fontdlg);
return IUP_DEFAULT;
}
static int item_tab_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
int replaceBySpace = !IupConfigGetVariableIntDef(config, "ScintillaFormat", "UseTabs", 1);
int tabSize = IupConfigGetVariableIntDef(config, "ScintillaFormat", "TabSize", 8);
if (IupGetParam("Tab Settings", setparent_param_cb, IupGetDialog(ih_item),
"Size: %i[1,]\n"
"Replace by Whitespace: %b\n",
&tabSize, &replaceBySpace, NULL))
{
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
IupSetInt(multitext, "TABSIZE", tabSize);
IupSetInt(multitext, "USETABS", !replaceBySpace);
}
IupConfigSetVariableInt(config, "ScintillaFormat", "TabSize", tabSize);
IupConfigSetVariableInt(config, "ScintillaFormat", "UseTabs", !replaceBySpace);
}
return IUP_DEFAULT;
}
static int item_zoomin_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "ZOOMIN", "10");
return IUP_DEFAULT;
}
static int item_zoomout_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "ZOOMOUT", "10");
return IUP_IGNORE; /* to avoid garbage in Scintilla when pressing the hot key */
}
static int item_restorezoom_action_cb(Ihandle* ih_item)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih_item);
IupSetAttribute(multitext, "ZOOM", "0");
return IUP_DEFAULT;
}
static int item_wordwrap_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char *value = IupGetAttribute(ih_item, "VALUE");
Ihandle* item_wordwrap = IupGetDialogChild(ih_item, "ITEM_WORDWRAP");
Ihandle* bt_wordwrap = IupGetDialogChild(ih_item, "BUTTON_WORDWRAP");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (iupStrBoolean(value))
IupSetAttribute(multitext, "WORDWRAP", "WORD");
else
IupSetAttribute(multitext, "WORDWRAP", "NONE");
}
if (ih_item == bt_wordwrap)
IupSetStrAttribute(item_wordwrap, "VALUE", value);
else
IupSetStrAttribute(bt_wordwrap, "VALUE", value);
IupConfigSetVariableStr(config, "ScintillaView", "WordWrap", value);
return IUP_DEFAULT;
}
static int item_showwhite_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char *value = IupGetAttribute(ih_item, "VALUE");
Ihandle* item_showwhite = IupGetDialogChild(ih_item, "ITEM_SHOWWHITE");
Ihandle* bt_showwhite = IupGetDialogChild(ih_item, "BUTTON_SHOWWHITE");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (iupStrBoolean(value))
IupSetAttribute(multitext, "WHITESPACEVIEW", "VISIBLEALWAYS");
else
IupSetAttribute(multitext, "WHITESPACEVIEW", "INVISIBLE");
}
if (ih_item == bt_showwhite)
IupSetStrAttribute(item_showwhite, "VALUE", value);
else
IupSetStrAttribute(bt_showwhite, "VALUE", value);
IupConfigSetVariableStr(config, "ScintillaView", "ShowWhite", value);
return IUP_DEFAULT;
}
static int item_panel_action_cb(Ihandle* ih_item)
{
Ihandle* panelSplit = IupGetDialogChild(ih_item, "PANEL_SPLIT");
if (IupGetInt(panelSplit, "VALUE") == 1000)
IupSetAttribute(panelSplit, "VALUE", "800");
else
IupSetAttribute(panelSplit, "VALUE", "1000");
return IUP_DEFAULT;
}
static int item_showeol_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char *value = IupGetAttribute(ih_item, "VALUE");
Ihandle* item_showeol = IupGetDialogChild(ih_item, "ITEM_SHOWEOL");
Ihandle* but_showeol = IupGetDialogChild(ih_item, "BUTTON_SHOWEOL");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (iupStrBoolean(value))
IupSetAttribute(multitext, "EOLVISIBLE", "YES");
else
IupSetAttribute(multitext, "EOLVISIBLE", "NO");
}
if (ih_item == but_showeol)
IupSetStrAttribute(item_showeol, "VALUE", value);
else
IupSetStrAttribute(but_showeol, "VALUE", value);
IupConfigSetVariableStr(config, "ScintillaView", "ShowEol", value);
return IUP_DEFAULT;
}
static int item_toolbar_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* toolbar = IupGetDialogChild(ih_item, "TOOLBAR");
Ihandle* config = iScintillaDlgGetConfig(tabs);
toggle_bar_visibility(ih_item, toolbar);
IupConfigSetVariableStr(config, "ScintillaView", "Toolbar", IupGetAttribute(ih_item, "VALUE"));
return IUP_DEFAULT;
}
static int item_statusbar_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle *statusbar = IupGetDialogChild(ih_item, "STATUSBAR");
Ihandle* config = iScintillaDlgGetConfig(tabs);
toggle_bar_visibility(ih_item, statusbar);
IupConfigSetVariableStr(config, "ScintillaView", "Statusbar", IupGetAttribute(ih_item, "VALUE"));
return IUP_DEFAULT;
}
static int item_linenumber_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char *value = IupGetAttribute(ih_item, "VALUE");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (iupStrBoolean(value))
IupSetAttribute(multitext, "MARGINWIDTH0", LINENUMBER_MARGIN);
else
IupSetAttribute(multitext, "MARGINWIDTH0", "0");
}
IupConfigSetVariableStr(config, "ScintillaView", "LineNumber", value);
return IUP_DEFAULT;
}
static int item_bookmark_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
Ihandle* multitext;
Ihandle* config = iScintillaDlgGetConfig(ih_item);
char *value = IupGetAttribute(ih_item, "VALUE");
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
if (iupStrBoolean(value))
IupSetAttribute(multitext, "MARGINWIDTH1", BOOKMARK_MARGIN);
else
IupSetAttribute(multitext, "MARGINWIDTH1", "0");
}
IupConfigSetVariableStr(config, "ScintillaView", "Bookmark", value);
return IUP_DEFAULT;
}
static int item_windowN_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
int pos = IupGetChildPos(IupGetParent(ih_item), ih_item);
IupSetInt(tabs, "VALUEPOS", pos);
return IUP_DEFAULT;
}
static int item_windows_action_cb(Ihandle* ih_item)
{
Ihandle* tabs = IupGetDialogChild(ih_item, "MULTITEXT_TABS");
int pos = IupGetInt(tabs, "VALUEPOS");
Ihandle* multitext;
int ret, count = 0, max_lin;
char* win_list_str[300];
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
{
char* filename = IupGetAttribute(multitext, "FILENAME");
win_list_str[count] = filename;
count++;
}
IupStoreGlobal("_IUP_OLD_PARENTDIALOG", IupGetGlobal("PARENTDIALOG"));
IupSetAttributeHandle(NULL, "PARENTDIALOG", IupGetDialog(tabs));
max_lin = count < 15 ? count + 1 : 15;
ret = IupListDialog(1, "Windows", count, (const char**)win_list_str, pos + 1, 30, max_lin, NULL);
IupStoreGlobal("PARENTDIALOG", IupGetGlobal("_IUP_OLD_PARENTDIALOG"));
IupSetGlobal("_IUP_OLD_PARENTDIALOG", NULL);
if (ret != -1)
IupSetInt(tabs, "VALUEPOS", ret);
return IUP_DEFAULT;
}
/********************************** Attributes *****************************************/
static void iScintillaDlgSetConfigMultitext(Ihandle* ih, Ihandle* config, Ihandle* multitext)
{
const char* value;
value = IupConfigGetVariableStr(config, "ScintillaFormat", "Font");
if (value)
IupSetStrAttribute(multitext, "FONT", value);
else
{
value = IupGetAttribute(multitext, "FONT");
IupConfigSetVariableStr(config, "ScintillaFormat", "Font", value);
}
value = IupConfigGetVariableStr(config, "ScintillaFormat", "TabSize");
if (value)
IupSetStrAttribute(multitext, "TABSIZE", value);
value = IupConfigGetVariableStr(config, "ScintillaFormat", "UseTabs");
if (value)
IupSetStrAttribute(multitext, "USETABS", value);
value = IupConfigGetVariableStr(config, "ScintillaView", "WordWrap");
if (value)
{
Ihandle* item_wordwrap = IupGetDialogChild(ih, "ITEM_WORDWRAP");
Ihandle* bt_wordwrap = IupGetDialogChild(ih, "BUTTON_WORDWRAP");
IupSetStrAttribute(item_wordwrap, "VALUE", value);
IupSetStrAttribute(bt_wordwrap, "VALUE", value);
if (iupStrBoolean(value))
IupSetAttribute(multitext, "WORDWRAP", "WORD");
else
IupSetAttribute(multitext, "WORDWRAP", "NONE");
}
value = IupConfigGetVariableStr(config, "ScintillaView", "ShowWhite");
if (value)
{
Ihandle* item_showwhite = IupGetDialogChild(ih, "ITEM_SHOWWHITE");
Ihandle* bt_showwhite = IupGetDialogChild(ih, "BUTTON_SHOWWHITE");
IupSetStrAttribute(item_showwhite, "VALUE", value);
IupSetStrAttribute(bt_showwhite, "VALUE", value);
if (iupStrBoolean(value))
IupSetAttribute(multitext, "WHITESPACEVIEW", "VISIBLEALWAYS");
else
IupSetAttribute(multitext, "WHITESPACEVIEW", "INVISIBLE");
}
value = IupConfigGetVariableStr(config, "ScintillaView", "ShowEol");
if (value)
{
Ihandle* item_showeol = IupGetDialogChild(ih, "ITEM_SHOWEOL");
Ihandle* but_showeol = IupGetDialogChild(ih, "BUTTON_SHOWEOL");
IupSetStrAttribute(item_showeol, "VALUE", value);
IupSetStrAttribute(but_showeol, "VALUE", value);
if (iupStrBoolean(value))
IupSetAttribute(multitext, "EOLVISIBLE", "YES");
else
IupSetAttribute(multitext, "EOLVISIBLE", "NO");
}
value = IupConfigGetVariableStr(config, "ScintillaView", "LineNumber");
if (value)
{
Ihandle* item_linenumber = IupGetDialogChild(ih, "ITEM_LINENUMBER");
IupSetStrAttribute(item_linenumber, "VALUE", value);
if (iupStrBoolean(value))
IupSetAttribute(multitext, "MARGINWIDTH0", LINENUMBER_MARGIN);
else
IupSetAttribute(multitext, "MARGINWIDTH0", "0");
}
value = IupConfigGetVariableStr(config, "ScintillaView", "Bookmark");
if (value)
{
Ihandle* item_bookmark = IupGetDialogChild(ih, "ITEM_BOOKMARK");
IupSetStrAttribute(item_bookmark, "VALUE", value);
if (iupStrBoolean(value))
IupSetAttribute(multitext, "MARGINWIDTH1", BOOKMARK_MARGIN);
else
IupSetAttribute(multitext, "MARGINWIDTH1", "0");
}
}
static void iScintillaDlgSetConfig(Ihandle* ih, Ihandle* config)
{
IFnn cb = (IFnn)IupGetCallback(ih, "CONFIGLOAD_CB");
Ihandle* recent_menu = (Ihandle*)iupAttribGet(ih, "_IUP_RECENTMENU");
Ihandle* recent_proj_menu = (Ihandle*)iupAttribGet(ih, "_IUP_PROJ_RECENTMENU");
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext;
const char* value;
value = IupConfigGetVariableStr(config, "ScintillaView", "Toolbar");
if (value && !iupStrBoolean(value))
{
Ihandle* item_toolbar = IupGetDialogChild(ih, "ITEM_TOOLBAR");
Ihandle* toolbar = IupGetDialogChild(ih, "TOOLBAR");
/* default is visible */
IupSetAttribute(toolbar, "FLOATING", "YES");
IupSetAttribute(toolbar, "VISIBLE", "NO");
IupSetAttribute(item_toolbar, "VALUE", "OFF");
}
value = IupConfigGetVariableStr(config, "ScintillaView", "Statusbar");
if (value && !iupStrBoolean(value))
{
Ihandle* item_statusbar = IupGetDialogChild(ih, "ITEM_STATUSBAR");
Ihandle *statusbar = IupGetDialogChild(ih, "STATUSBAR");
/* default is visible */
IupSetAttribute(statusbar, "FLOATING", "YES");
IupSetAttribute(statusbar, "VISIBLE", "NO");
IupSetAttribute(item_statusbar, "VALUE", "OFF");
}
for (multitext = tabs->firstchild; multitext; multitext = multitext->brother)
iScintillaDlgSetConfigMultitext(ih, config, multitext);
IupSetAttribute(config, "RECENTNAME", "ScintillaRecent");
IupConfigRecentInit(config, recent_menu, config_recent_cb, 10);
IupSetAttribute(config, "RECENTNAME", "ScintillaRecentProject");
IupConfigRecentInit(config, recent_proj_menu, config_recent_proj_cb, 10);
value = IupConfigGetVariableStr(config, IupGetAttribute(ih, "SUBTITLE"), "Split");
if (value)
{
Ihandle* panelSplit = IupGetDialogChild(ih, "PANEL_SPLIT");
IupSetStrAttribute(panelSplit, "VALUE", value);
}
if (cb)
cb(ih, config);
}
static int iScintillaDlgSetConfigHandleAttrib(Ihandle* ih, const char* value)
{
Ihandle *old_config, *config = (Ihandle*)value;
if (!iupObjectCheck(config))
return 0;
/* only valid before map */
if (ih->handle)
return 0;
old_config = iScintillaDlgGetConfig(ih);
IupDestroy(old_config);
iupAttribSet(ih, "_IUP_CONFIG", (char*)config);
/* make sure it has at least one name */
if (!iupAttribGetHandleName(config))
iupAttribSetHandleName(config);
iScintillaDlgSetConfig(ih, config);
return 0;
}
static char* iScintillaDlgGetConfigHandleAttrib(Ihandle* ih)
{
Ihandle* projectConfig = iScintillaDlgGetProjectConfig(ih);
if (projectConfig)
return (char*)projectConfig;
else
{
Ihandle* config = iScintillaDlgGetConfig(ih);
return (char*)config;
}
}
static int iScintillaDlgSetConfigAttrib(Ihandle* ih, const char* value)
{
Ihandle* config = IupGetHandle(value);
iScintillaDlgSetConfigHandleAttrib(ih, (char*)config);
return 0;
}
static char* iScintillaDlgGetConfigAttrib(Ihandle* ih)
{
Ihandle* config = iScintillaDlgGetConfig(ih);
return IupGetName(config);
}
static int iScintillaDlgSetSubTitleAttrib(Ihandle* ih, const char* value)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
iupAttribSetStr(ih, "SUBTITLE", value);
update_dialog_title(multitext);
return 1;
}
static int iScintillaDlgSetUpdateTitleAttrib(Ihandle* ih, const char* value)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
update_dialog_title(multitext);
(void)value;
return 0;
}
static int iScintillaDlgSetOpenFileAttrib(Ihandle* ih, const char* value)
{
if (value)
{
if (!check_open_revert(ih, value))
open_file(ih, value, 1);
}
else
new_file(ih);
return 0;
}
static int iScintillaDlgSetOpenProjectAttrib(Ihandle* ih, const char* value)
{
if (value)
open_proj(ih, value);
return 0;
}
static int iScintillaDlgSetSaveFileAttrib(Ihandle* ih, const char* value)
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
if (value)
{
if (!check_open_to_save(ih, value))
saveas_file(multitext, value);
}
else
save_file(multitext);
return 0;
}
static int iScintillaDlgSetForceCloseFileAttrib(Ihandle* ih, const char* value)
{
int pos;
if (iupStrToInt(value, &pos))
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext = IupGetChild(tabs, pos);
iScintillaDlgCloseMultitext(multitext, 0);
if (IupGetChildCount(tabs) == 0)
new_file(ih); /* always keep at least one multitext */
}
return 0;
}
static int iScintillaDlgSetCloseFileAttrib(Ihandle* ih, const char* value)
{
int pos;
if (iupStrToInt(value, &pos))
{
Ihandle* tabs = IupGetDialogChild(ih, "MULTITEXT_TABS");
Ihandle* multitext = IupGetChild(tabs, pos);
iScintillaDlgCloseMultitext(multitext, 1);
if (IupGetChildCount(tabs) == 0)
new_file(ih); /* always keep at least one multitext */
}
return 0;
}
static int iScintillaDlgSetToggleMarkerAttribId(Ihandle* ih, int id, const char* value)
{
int margin;
if (iupStrToInt(value, &margin))
{
Ihandle* multitext = iScintillaDlgGetCurrentMultitext(ih);
toggleMarker(multitext, id, margin);
}
return 0;
}
/********************************** Main *****************************************/
static int iScintillaDlgCreateMethod(Ihandle* ih, void** params)
{
Ihandle *vbox, *projectSplit, *tabs, *projectTree, *menu;
Ihandle *sub_menu_file, *file_menu, *item_exit, *item_new, *item_open, *item_save, *item_saveas, *item_revert;
Ihandle *sub_menu_edit, *edit_menu, *item_find, *item_find_next, *item_goto, *item_gotombrace, *item_copy, *item_paste, *item_cut, *item_delete, *item_select_all;
Ihandle *sub_menu_project, *project_menu, *item_new_proj, *item_new_blank_proj, *item_open_proj, *item_save_proj, *item_save_proj_as,
*item_close_proj, *item_add_new_file, *item_add_exist_file, *item_add_open_file, *item_open_proj_file, *item_open_all_proj_file, *item_remove_proj_file;
Ihandle *item_togglemark, *item_nextmark, *item_previousmark, *item_clearmarks, *item_cutmarked, *item_copymarked, *item_pastetomarked, *item_removemarked,
*item_invertmarks, *item_tabtospace, *item_allspacetotab, *item_leadingspacetotab;
Ihandle *item_trimleading, *item_trimtrailing, *item_trimtraillead, *item_eoltospace, *item_eol_cr, *item_eol_crlf, *item_eol_lf, *item_removespaceeol;
Ihandle *item_undo, *item_redo, *item_pagesetup, *item_print, *item_undo_all;
Ihandle *case_menu, *item_uppercase, *item_lowercase;
Ihandle *btn_cut, *btn_copy, *btn_paste, *btn_find, *btn_new, *btn_open, *btn_save;
Ihandle *sub_menu_format, *format_menu, *item_font, *item_tab, *item_replace;
Ihandle *sub_menu_view, *view_menu, *item_panel, *item_toolbar, *item_statusbar, *item_linenumber, *item_bookmark;
Ihandle *zoom_menu, *item_zoomin, *item_zoomout, *item_restorezoom;
Ihandle *item_savecopy, *item_saveall, *item_closeall, *item_close, *item_rename, *item_windows, *item_loadsession, *item_savesession;
Ihandle *statusbar, *toolbar, *recent_menu, *recent_proj_menu, *window_menu, *sub_menu_window, *item_window1;
Ihandle *item_wordwrap, *item_showwhite, *item_showeol, *bt_showeol, *bt_wordwrap, *bt_showwhite;
Ihandle *panelFrame, *panelTabs, *listSearch, *panelSplit;
int utf8 = IupGetInt(NULL, "UTF8MODE");
tabs = IupFlatTabs(NULL);
IupSetAttribute(tabs, "NAME", "MULTITEXT_TABS");
IupSetAttribute(tabs, "SHOWCLOSE", "YES");
IupSetAttribute(tabs, "TABCHANGEONCHECK", "YES");
IupSetAttribute(tabs, "TABTITLE0", "Untitled #1");
IupSetCallback(tabs, "TABCLOSE_CB", (Icallback)tabs_close_cb);
IupSetCallback(tabs, "TABCHANGE_CB", (Icallback)tabs_change_cb);
IupSetCallback(tabs, "RIGHTCLICK_CB", (Icallback)tabs_rightclick_cb);
projectTree = IupTree();
IupSetAttribute(projectTree, "NAME", "PROJECTTREE");
IupSetAttribute(projectTree, "TITLE0", "Untitled Project");
IupSetAttribute(projectTree, "SHOWRENAME", "Yes");
IupSetAttribute(projectTree, "IMAGELEAF", "IMGPAPER");
IupSetCallback(projectTree, "EXECUTELEAF_CB", (Icallback)tree_executeleaf_cb);
IupSetCallback(projectTree, "RIGHTCLICK_CB", (Icallback)tree_rightclick_cb);
IupSetCallback(projectTree, "SHOWRENAME_CB", (Icallback)tree_showrename_cb);
IupSetCallback(projectTree, "RENAME_CB", (Icallback)tree_rename_cb);
IupSetCallback(projectTree, "DROPFILES_CB", (Icallback)tree_dropfiles_cb);
IupSetCallback(projectTree, "K_DEL", (Icallback)leaf_remove_action_cb);
IupSetCallback(projectTree, "K_F2", (Icallback)leaf_rename_action_cb);
IupSetCallback(projectTree, "K_CR", (Icallback)leaf_open_action_cb);
projectSplit = IupSplit(projectTree, tabs);
IupSetAttribute(projectSplit, "NAME", "PROJECTSPLIT");
IupSetAttribute(projectSplit, "ORIENTATION", "VERTICAL");
IupSetAttribute(projectSplit, "LAYOUTDRAG", "NO");
IupSetAttribute(projectSplit, "AUTOHIDE", "YES");
IupSetAttribute(projectSplit, "COLOR", "50 150 255");
IupSetAttribute(projectSplit, "VALUE", "0");
listSearch = IupList(NULL);
IupSetAttribute(listSearch, "EXPAND", "YES");
IupSetAttribute(listSearch, "NAME", "LIST_SEARCH");
IupSetCallback(listSearch, "DBLCLICK_CB", (Icallback)list_search_dblclick_cb);
IupSetAttribute(listSearch, "VISIBLELINES", "3");
panelFrame = IupFrame(listSearch);
IupSetAttribute(panelFrame, "MARGIN", "4x4");
IupSetAttribute(panelFrame, "GAP", "4");
IupSetAttribute(panelFrame, "TITLE", "Find Results:");
IupSetAttribute(panelFrame, "TABTITLE", "Find");
panelTabs = IupTabs(panelFrame, NULL);
IupSetAttribute(panelTabs, "MARGIN", "0x0");
IupSetAttribute(panelTabs, "GAP", "4");
IupSetAttribute(panelTabs, "TABTYPE", "BOTTOM");
IupSetAttribute(panelTabs, "NAME", "PANEL_TABS");
panelSplit = IupSplit(projectSplit, panelTabs);
IupSetAttribute(panelSplit, "NAME", "PANEL_SPLIT");
IupSetAttribute(panelSplit, "ORIENTATION", "HORIZONTAL");
IupSetAttribute(panelSplit, "LAYOUTDRAG", "NO");
IupSetAttribute(panelSplit, "AUTOHIDE", "YES");
IupSetAttribute(panelSplit, "MINMAX", "100:1000");
IupSetAttribute(panelSplit, "COLOR", "50 150 255");
statusbar = IupLabel("Lin 1, Col 1");
IupSetAttribute(statusbar, "NAME", "STATUSBAR");
IupSetAttribute(statusbar, "EXPAND", "HORIZONTAL");
IupSetAttribute(statusbar, "PADDING", "10x5");
item_new = IupItem("&New\tCtrl+N", NULL);
IupSetAttribute(item_new, "IMAGE", "IUP_FileNew");
IupSetCallback(item_new, "ACTION", (Icallback)item_new_action_cb);
btn_new = IupButton(NULL, NULL);
IupSetAttribute(btn_new, "IMAGE", "IUP_FileNew");
IupSetAttribute(btn_new, "FLAT", "Yes");
IupSetCallback(btn_new, "ACTION", (Icallback)item_new_action_cb);
IupSetAttribute(btn_new, "TIP", "New (Ctrl+N)");
IupSetAttribute(btn_new, "CANFOCUS", "No");
item_open = IupItem("&Open...\tCtrl+O", NULL);
IupSetAttribute(item_open, "IMAGE", "IUP_FileOpen");
IupSetCallback(item_open, "ACTION", (Icallback)item_open_action_cb);
btn_open = IupButton(NULL, NULL);
IupSetAttribute(btn_open, "IMAGE", "IUP_FileOpen");
IupSetAttribute(btn_open, "FLAT", "Yes");
IupSetCallback(btn_open, "ACTION", (Icallback)item_open_action_cb);
IupSetAttribute(btn_open, "TIP", "Open (Ctrl+O)");
IupSetAttribute(btn_open, "CANFOCUS", "No");
item_save = IupItem("&Save\tCtrl+S", NULL);
IupSetAttribute(item_save, "NAME", "ITEM_SAVE");
IupSetAttribute(item_save, "IMAGE", "IUP_FileSave");
IupSetCallback(item_save, "ACTION", (Icallback)item_save_action_cb);
btn_save = IupButton(NULL, NULL);
IupSetAttribute(btn_save, "IMAGE", "IUP_FileSave");
IupSetAttribute(btn_save, "FLAT", "Yes");
IupSetCallback(btn_save, "ACTION", (Icallback)item_save_action_cb);
IupSetAttribute(btn_save, "TIP", "Save (Ctrl+S)\nPress <Shift> to save all open files.");
IupSetAttribute(btn_save, "CANFOCUS", "No");
item_saveas = IupItem("Save &As...", NULL);
IupSetCallback(item_saveas, "ACTION", (Icallback)item_saveas_action_cb);
item_savecopy = IupItem("Save Cop&y...", NULL);
IupSetCallback(item_savecopy, "ACTION", (Icallback)item_savecopy_action_cb);
item_saveall = IupItem("Save A&ll\tCtrl+Shift+S", NULL);
IupSetCallback(item_saveall, "ACTION", (Icallback)item_saveall_action_cb);
item_closeall = IupItem("Cl&ose All\tCtrl+Shift+F4", NULL);
IupSetCallback(item_closeall, "ACTION", (Icallback)item_closeall_action_cb);
item_close = IupItem("&Close\tCtrl+F4", NULL);
IupSetCallback(item_close, "ACTION", (Icallback)item_close_action_cb);
item_rename = IupItem("R&ename...", NULL);
IupSetCallback(item_rename, "ACTION", (Icallback)item_rename_action_cb);
item_revert = IupItem("&Revert", NULL);
IupSetAttribute(item_revert, "NAME", "ITEM_REVERT");
IupSetCallback(item_revert, "ACTION", (Icallback)item_revert_action_cb);
item_print = IupItem("&Print...\tCtrl+P", NULL);
IupSetCallback(item_print, "ACTION", (Icallback)item_print_action_cb);
item_pagesetup = IupItem("Page Set&up...", NULL);
IupSetCallback(item_pagesetup, "ACTION", (Icallback)item_pagesetup_action_cb);
item_loadsession = IupItem("Load Session...", NULL);
IupSetCallback(item_loadsession, "ACTION", (Icallback)item_loadsession_action_cb);
item_savesession = IupItem("Save Session...", NULL);
IupSetCallback(item_savesession, "ACTION", (Icallback)item_savesession_action_cb);
item_exit = IupItem("E&xit", NULL);
IupSetCallback(item_exit, "ACTION", (Icallback)close_exit_action_cb);
item_new_proj = IupItem("&New Project", NULL);
IupSetCallback(item_new_proj, "ACTION", (Icallback)item_new_proj_action_cb);
item_new_blank_proj = IupItem("New &Blank Project", NULL);
IupSetCallback(item_new_blank_proj, "ACTION", (Icallback)item_new_blank_proj_action_cb);
item_open_proj = IupItem("&Open Project...", NULL);
IupSetCallback(item_open_proj, "ACTION", (Icallback)item_open_proj_action_cb);
item_save_proj = IupItem("&Save Project", NULL);
IupSetAttribute(item_save_proj, "NAME", "ITEM_SAVE_PROJ");
IupSetCallback(item_save_proj, "ACTION", (Icallback)item_save_proj_action_cb);
item_save_proj_as = IupItem("Save Project &As...", NULL);
IupSetAttribute(item_save_proj_as, "NAME", "ITEM_SAVE_PROJ_AS");
IupSetCallback(item_save_proj_as, "ACTION", (Icallback)item_save_proj_as_action_cb);
item_close_proj = IupItem("&Close Project", NULL);
IupSetAttribute(item_close_proj, "NAME", "ITEM_CLOSE_PROJ");
IupSetCallback(item_close_proj, "ACTION", (Icallback)item_close_proj_action_cb);
item_add_new_file = IupItem("&Add New File...", NULL);
IupSetAttribute(item_add_new_file, "NAME", "ITEM_ADD_NEW_FILE");
IupSetCallback(item_add_new_file, "ACTION", (Icallback)item_add_new_file_action_cb);
item_add_exist_file = IupItem("Add &Existing File...", NULL);
IupSetAttribute(item_add_exist_file, "NAME", "ITEM_ADD_EXIST_FILE");
IupSetCallback(item_add_exist_file, "ACTION", (Icallback)item_add_exist_file_action_cb);
item_add_open_file = IupItem("Add O&pened File...", NULL);
IupSetAttribute(item_add_open_file, "NAME", "ITEM_ADD_OPEN_FILE");
IupSetCallback(item_add_open_file, "ACTION", (Icallback)item_add_open_file_action_cb);
item_open_proj_file = IupItem("Open Selected &File", NULL);
IupSetAttribute(item_open_proj_file, "NAME", "ITEM_OPEN_PROJ_FILE");
IupSetCallback(item_open_proj_file, "ACTION", (Icallback)item_open_proj_file_action_cb);
item_open_all_proj_file = IupItem("Open A&ll Files", NULL);
IupSetAttribute(item_open_all_proj_file, "NAME", "ITEM_OPEN_ALL_PROJ_FILE");
IupSetCallback(item_open_all_proj_file, "ACTION", (Icallback)item_open_all_proj_file_action_cb);
item_remove_proj_file = IupItem("&Remove Selected File", NULL);
IupSetAttribute(item_remove_proj_file, "NAME", "ITEM_REMOVE_PROJ_FILE");
IupSetCallback(item_remove_proj_file, "ACTION", (Icallback)item_remove_proj_file_action_cb);
item_find = IupItem("&Find...\tCtrl+F", NULL);
IupSetAttribute(item_find, "IMAGE", "IUP_EditFind");
IupSetCallback(item_find, "ACTION", (Icallback)item_find_action_cb);
btn_find = IupButton(NULL, NULL);
IupSetAttribute(btn_find, "IMAGE", "IUP_EditFind");
IupSetAttribute(btn_find, "FLAT", "Yes");
IupSetCallback(btn_find, "ACTION", (Icallback)item_find_action_cb);
IupSetAttribute(btn_find, "TIP", "Find (Ctrl+F)");
IupSetAttribute(btn_find, "CANFOCUS", "No");
item_find_next = IupItem("Find &Next\tF3", NULL);
IupSetAttribute(item_find_next, "NAME", "ITEM_FINDNEXT");
IupSetCallback(item_find_next, "ACTION", (Icallback)find_next_action_cb);
item_replace = IupItem("&Replace...\tCtrl+H", NULL);
IupSetCallback(item_replace, "ACTION", (Icallback)item_replace_action_cb);
item_cut = IupItem("Cu&t\tCtrl+X", NULL);
IupSetAttribute(item_cut, "NAME", "ITEM_CUT");
IupSetAttribute(item_cut, "IMAGE", "IUP_EditCut");
IupSetCallback(item_cut, "ACTION", (Icallback)item_cut_action_cb);
btn_cut = IupButton(NULL, NULL);
IupSetAttribute(btn_cut, "IMAGE", "IUP_EditCut");
IupSetAttribute(btn_cut, "FLAT", "Yes");
IupSetCallback(btn_cut, "ACTION", (Icallback)item_cut_action_cb);
IupSetAttribute(btn_cut, "TIP", "Cut (Ctrl+X)");
IupSetAttribute(btn_cut, "CANFOCUS", "No");
item_copy = IupItem("&Copy\tCtrl+C", NULL);
IupSetAttribute(item_copy, "NAME", "ITEM_COPY");
IupSetAttribute(item_copy, "IMAGE", "IUP_EditCopy");
IupSetCallback(item_copy, "ACTION", (Icallback)item_copy_action_cb);
btn_copy = IupButton(NULL, NULL);
IupSetAttribute(btn_copy, "IMAGE", "IUP_EditCopy");
IupSetAttribute(btn_copy, "FLAT", "Yes");
IupSetCallback(btn_copy, "ACTION", (Icallback)item_copy_action_cb);
IupSetAttribute(btn_copy, "TIP", "Copy (Ctrl+C)");
IupSetAttribute(btn_copy, "CANFOCUS", "No");
item_paste = IupItem("&Paste\tCtrl+V", NULL);
IupSetAttribute(item_paste, "NAME", "ITEM_PASTE");
IupSetAttribute(item_paste, "IMAGE", "IUP_EditPaste");
IupSetCallback(item_paste, "ACTION", (Icallback)item_paste_action_cb);
btn_paste = IupButton(NULL, NULL);
IupSetAttribute(btn_paste, "IMAGE", "IUP_EditPaste");
IupSetAttribute(btn_paste, "FLAT", "Yes");
IupSetCallback(btn_paste, "ACTION", (Icallback)item_paste_action_cb);
IupSetAttribute(btn_paste, "TIP", "Paste (Ctrl+V)");
IupSetAttribute(btn_paste, "CANFOCUS", "No");
item_delete = IupItem("&Delete\tDel", NULL);
IupSetAttribute(item_delete, "IMAGE", "IUP_EditErase");
IupSetAttribute(item_delete, "NAME", "ITEM_DELETE");
IupSetCallback(item_delete, "ACTION", (Icallback)item_delete_action_cb);
item_select_all = IupItem("Select &All\tCtrl+A", NULL);
IupSetCallback(item_select_all, "ACTION", (Icallback)item_select_all_action_cb);
item_undo = IupItem("Undo\tCtrl+Z", NULL);
IupSetAttribute(item_undo, "NAME", "ITEM_UNDO");
IupSetCallback(item_undo, "ACTION", (Icallback)item_undo_action_cb);
item_undo_all = IupItem("Undo All", NULL);
IupSetAttribute(item_undo_all, "NAME", "ITEM_UNDO_ALL");
IupSetCallback(item_undo_all, "ACTION", (Icallback)item_undo_all_action_cb);
item_redo = IupItem("Redo\tCtrl+Y", NULL);
IupSetAttribute(item_redo, "NAME", "ITEM_REDO");
IupSetCallback(item_redo, "ACTION", (Icallback)item_redo_action_cb);
item_uppercase = IupItem("UPPERCASE\tCtrl+Shift+U", NULL);
IupSetCallback(item_uppercase, "ACTION", (Icallback)item_uppercase_action_cb);
item_lowercase = IupItem("lowercase\tCtrl+U", NULL);
IupSetCallback(item_lowercase, "ACTION", (Icallback)item_lowercase_action_cb);
item_goto = IupItem("&Go To...\tCtrl+G", NULL);
IupSetCallback(item_goto, "ACTION", (Icallback)item_goto_action_cb);
item_gotombrace = IupItem("Go To Matching Brace\tCtrl+B", NULL);
IupSetCallback(item_gotombrace, "ACTION", (Icallback)item_gotombrace_action_cb);
item_togglemark = IupItem("Toggle Bookmark\tCtrl+F2", NULL);
IupSetCallback(item_togglemark, "ACTION", (Icallback)item_togglemark_action_cb);
item_nextmark = IupItem("Next Bookmark\tF2", NULL);
IupSetCallback(item_nextmark, "ACTION", (Icallback)item_nextmark_action_cb);
item_previousmark = IupItem("Previous Bookmark\tShift+F2", NULL);
IupSetCallback(item_previousmark, "ACTION", (Icallback)item_previousmark_action_cb);
item_clearmarks = IupItem("Clear All Bookmarks", NULL);
IupSetCallback(item_clearmarks, "ACTION", (Icallback)item_clearmarks_action_cb);
item_copymarked = IupItem("Copy Bookmarked Lines", NULL);
IupSetCallback(item_copymarked, "ACTION", (Icallback)item_copymarked_action_cb);
item_cutmarked = IupItem("Cut Bookmarked Lines", NULL);
IupSetCallback(item_cutmarked, "ACTION", (Icallback)item_cutmarked_action_cb);
item_pastetomarked = IupItem("Paste to (Replace) Bookmarked Lines", NULL);
IupSetCallback(item_pastetomarked, "ACTION", (Icallback)item_pastetomarked_action_cb);
item_removemarked = IupItem("Remove Bookmarked Lines", NULL);
IupSetCallback(item_removemarked, "ACTION", (Icallback)item_removemarked_action_cb);
item_invertmarks = IupItem("Invert Bookmarks", NULL);
IupSetCallback(item_invertmarks, "ACTION", (Icallback)item_invertmarks_action_cb);
item_trimtrailing = IupItem("Trim Trailing Space", NULL);
IupSetCallback(item_trimtrailing, "ACTION", (Icallback)item_trimtrailing_action_cb);
item_trimtraillead = IupItem("Trim Trailing and Leading Space", NULL);
IupSetCallback(item_trimtraillead, "ACTION", (Icallback)item_trimtraillead_action_cb);
item_eoltospace = IupItem("End of Lines to Spaces", NULL);
IupSetCallback(item_eoltospace, "ACTION", (Icallback)item_eoltospace_action_cb);
item_eol_cr = IupItem("CR (Macintosh)", NULL);
IupSetAttribute(item_eol_cr, "EOL", "CR");
IupSetCallback(item_eol_cr, "ACTION", (Icallback)item_eol_action_cb);
item_eol_crlf = IupItem("CRLF (Windows)", NULL);
IupSetAttribute(item_eol_crlf, "EOL", "CRLF");
IupSetCallback(item_eol_crlf, "ACTION", (Icallback)item_eol_action_cb);
item_eol_lf = IupItem("LF (UNIX)", NULL);
IupSetAttribute(item_eol_lf, "EOL", "LF");
IupSetCallback(item_eol_lf, "ACTION", (Icallback)item_eol_action_cb);
item_removespaceeol = IupItem("Remove Unnecessary Blanks and EOL", NULL);
IupSetCallback(item_removespaceeol, "ACTION", (Icallback)item_removespaceeol_action_cb);
item_trimleading = IupItem("Trim Leading Space", NULL);
IupSetCallback(item_trimleading, "ACTION", (Icallback)item_trimleading_action_cb);
item_tabtospace = IupItem("TABs to Spaces", NULL);
IupSetCallback(item_tabtospace, "ACTION", (Icallback)item_tabtospace_action_cb);
item_allspacetotab = IupItem("Spaces to TABs (All)", NULL);
IupSetCallback(item_allspacetotab, "ACTION", (Icallback)item_allspacetotab_action_cb);
item_leadingspacetotab = IupItem("Spaces to TABs (Leading)", NULL);
IupSetCallback(item_leadingspacetotab, "ACTION", (Icallback)item_leadingspacetotab_action_cb);
item_zoomin = IupItem("Zoom In\tCtrl+'+'", NULL);
IupSetCallback(item_zoomin, "ACTION", (Icallback)item_zoomin_action_cb);
item_zoomout = IupItem("Zoom Out\tCtrl+'-'", NULL);
IupSetCallback(item_zoomout, "ACTION", (Icallback)item_zoomout_action_cb);
item_restorezoom = IupItem("Reset Zoom\tCtrl+/", NULL);
IupSetCallback(item_restorezoom, "ACTION", (Icallback)item_restorezoom_action_cb);
item_wordwrap = IupItem("Word Wrap", NULL);
IupSetCallback(item_wordwrap, "ACTION", (Icallback)item_wordwrap_action_cb);
IupSetAttribute(item_wordwrap, "AUTOTOGGLE", "YES");
IupSetAttribute(item_wordwrap, "NAME", "ITEM_WORDWRAP");
bt_wordwrap = IupFlatToggle(utf8 ? "W\xC2\xAC" : "W\xAC");
IupSetAttribute(bt_wordwrap, "CHECKSIZE", "0");
IupSetAttribute(bt_wordwrap, "PADDING", "2x0");
IupSetCallback(bt_wordwrap, "FLAT_ACTION", (Icallback)item_wordwrap_action_cb);
IupSetAttribute(bt_wordwrap, "TIP", "Word Wrap");
IupSetAttribute(bt_wordwrap, "TIPFONT", "SYSTEM");
IupSetAttribute(bt_wordwrap, "CANFOCUS", "No");
IupSetAttribute(bt_wordwrap, "NAME", "BUTTON_WORDWRAP");
IupSetInt(bt_wordwrap, "FONTSIZE", IupGetInt(bt_wordwrap, "FONTSIZE") + 2);
item_showwhite = IupItem("Show White Spaces", NULL);
IupSetCallback(item_showwhite, "ACTION", (Icallback)item_showwhite_action_cb);
IupSetAttribute(item_showwhite, "AUTOTOGGLE", "YES");
IupSetAttribute(item_showwhite, "NAME", "ITEM_SHOWWHITE");
bt_showwhite = IupFlatToggle(utf8? "a\xC2\xB7\x62": "a\xB7\x62");
IupSetAttribute(bt_showwhite, "CHECKSIZE", "0");
IupSetAttribute(bt_showwhite, "PADDING", "2x3");
IupSetCallback(bt_showwhite, "FLAT_ACTION", (Icallback)item_showwhite_action_cb);
IupSetAttribute(bt_showwhite, "TIP", "Show White Spaces");
IupSetAttribute(bt_showwhite, "TIPFONT", "SYSTEM");
IupSetAttribute(bt_showwhite, "CANFOCUS", "No");
IupSetAttribute(bt_showwhite, "NAME", "BUTTON_SHOWWHITE");
item_showeol = IupItem("Show End of Lines", NULL);
IupSetCallback(item_showeol, "ACTION", (Icallback)item_showeol_action_cb);
IupSetAttribute(item_showeol, "AUTOTOGGLE", "YES");
IupSetAttribute(item_showeol, "NAME", "ITEM_SHOWEOL");
bt_showeol = IupFlatToggle(utf8 ? "\xC2\xB6" : "\xB6");
IupSetAttribute(bt_showeol, "CHECKSIZE", "0");
IupSetAttribute(bt_showeol, "FONTSTYLE", "Bold");
IupSetAttribute(bt_showeol, "PADDING", "4x0");
IupSetCallback(bt_showeol, "FLAT_ACTION", (Icallback)item_showeol_action_cb);
IupSetAttribute(bt_showeol, "TIP", "Show End of Lines");
IupSetAttribute(bt_showeol, "TIPFONT", "SYSTEM");
IupSetAttribute(bt_showeol, "CANFOCUS", "No");
IupSetAttribute(bt_showeol, "NAME", "BUTTON_SHOWEOL");
IupSetInt(bt_showeol, "FONTSIZE", IupGetInt(bt_showeol, "FONTSIZE") + 2);
item_panel = IupItem("Panel", NULL);
IupSetAttribute(item_panel, "NAME", "ITM_PANEL");
IupSetCallback(item_panel, "ACTION", (Icallback)item_panel_action_cb);
IupSetAttribute(item_panel, "VALUE", "ON");
item_toolbar = IupItem("&Toolbar", NULL);
IupSetCallback(item_toolbar, "ACTION", (Icallback)item_toolbar_action_cb);
IupSetAttribute(item_toolbar, "VALUE", "ON");
IupSetAttribute(item_toolbar, "NAME", "ITEM_TOOLBAR");
item_statusbar = IupItem("&Statusbar", NULL);
IupSetCallback(item_statusbar, "ACTION", (Icallback)item_statusbar_action_cb);
IupSetAttribute(item_statusbar, "VALUE", "ON");
IupSetAttribute(item_statusbar, "NAME", "ITEM_STATUSBAR");
item_linenumber = IupItem("Display Line Numbers", NULL);
IupSetCallback(item_linenumber, "ACTION", (Icallback)item_linenumber_action_cb);
IupSetAttribute(item_linenumber, "AUTOTOGGLE", "YES");
IupSetAttribute(item_linenumber, "VALUE", "ON");
IupSetAttribute(item_linenumber, "NAME", "ITEM_LINENUMBER");
item_bookmark = IupItem("Display Bookmarks", NULL);
IupSetCallback(item_bookmark, "ACTION", (Icallback)item_bookmark_action_cb);
IupSetAttribute(item_bookmark, "AUTOTOGGLE", "YES");
IupSetAttribute(item_bookmark, "VALUE", "ON");
IupSetAttribute(item_bookmark, "NAME", "ITEM_BOOKMARK");
item_font = IupItem("&Font...", NULL);
IupSetCallback(item_font, "ACTION", (Icallback)item_font_action_cb);
item_tab = IupItem("Tab...", NULL);
IupSetCallback(item_tab, "ACTION", (Icallback)item_tab_action_cb);
item_window1 = IupItem("1 Untitled #1", NULL);
IupSetAttribute(item_window1, "NAME", "ITEM_WINDOW1");
IupSetCallback(item_window1, "ACTION", (Icallback)item_windowN_action_cb);
IupSetAttribute(item_window1, "VALUE", "ON");
item_windows = IupItem("Windows...", NULL);
IupSetCallback(item_windows, "ACTION", (Icallback)item_windows_action_cb);
recent_menu = IupMenu(NULL);
iupAttribSet(ih, "_IUP_RECENTMENU", (char*)recent_menu);
recent_proj_menu = IupMenu(NULL);
iupAttribSet(ih, "_IUP_PROJ_RECENTMENU", (char*)recent_proj_menu);
file_menu = IupMenu(
item_new,
item_open,
item_close,
item_closeall,
item_revert,
IupSeparator(),
item_save,
item_saveas,
item_savecopy,
item_saveall,
item_rename,
IupSeparator(),
item_pagesetup,
item_print,
IupSeparator(),
item_loadsession,
item_savesession,
IupSeparator(),
IupSubmenu("Recent &Files", recent_menu),
item_exit,
NULL);
project_menu = IupMenu(
item_new_blank_proj,
item_new_proj,
item_open_proj,
item_close_proj,
IupSeparator(),
item_save_proj,
item_save_proj_as,
IupSeparator(),
item_add_new_file,
item_add_exist_file,
item_add_open_file,
item_remove_proj_file,
IupSeparator(),
item_open_proj_file,
item_open_all_proj_file,
IupSeparator(),
IupSubmenu("Recent &Projects", recent_proj_menu),
NULL);
edit_menu = IupMenu(
item_undo,
item_redo,
item_undo_all,
IupSeparator(),
item_cut,
item_copy,
item_paste,
item_delete,
IupSeparator(),
item_find,
item_find_next,
item_replace,
item_goto,
item_gotombrace,
IupSeparator(),
IupSubmenu("Bookmarks", IupMenu(item_togglemark,
item_nextmark,
item_previousmark,
item_clearmarks,
item_cutmarked,
item_copymarked,
item_pastetomarked,
item_removemarked,
item_invertmarks,
NULL)),
IupSubmenu("Blank Operations", IupMenu(
item_trimtrailing,
item_trimleading,
item_trimtraillead,
item_eoltospace,
item_removespaceeol,
IupSeparator(),
item_tabtospace,
item_allspacetotab,
item_leadingspacetotab,
NULL)),
IupSubmenu("End of Lines", IupMenu(
item_eol_lf,
item_eol_crlf,
item_eol_cr,
NULL)),
IupSubmenu("Convert Case to", case_menu = IupMenu(
item_uppercase,
item_lowercase,
NULL)),
IupSeparator(),
item_select_all,
NULL);
format_menu = IupMenu(
item_font,
item_tab,
NULL);
view_menu = IupMenu(
IupSubmenu("Zoom", zoom_menu = IupMenu(
item_zoomin,
item_zoomout,
item_restorezoom,
NULL)),
item_wordwrap,
item_showwhite,
item_showeol,
item_linenumber,
item_bookmark,
IupSeparator(),
item_panel,
item_toolbar,
item_statusbar,
NULL);
window_menu = IupMenu(
item_window1,
IupSeparator(),
item_windows,
NULL);
IupSetCallback(file_menu, "OPEN_CB", (Icallback)file_menu_open_cb);
IupSetCallback(edit_menu, "OPEN_CB", (Icallback)edit_menu_open_cb);
IupSetCallback(window_menu, "OPEN_CB", (Icallback)window_menu_open_cb);
IupSetCallback(project_menu, "OPEN_CB", (Icallback)project_menu_open_cb);
IupSetCallback(view_menu, "OPEN_CB", (Icallback)view_menu_open_cb);
sub_menu_file = IupSubmenu("&File", file_menu);
sub_menu_project = IupSubmenu("&Project", project_menu);
sub_menu_edit = IupSubmenu("&Edit", edit_menu);
sub_menu_format = IupSubmenu("F&ormat", format_menu);
sub_menu_view = IupSubmenu("&View", view_menu);
sub_menu_window = IupSubmenu("&Window", window_menu);
menu = IupMenu(
sub_menu_file,
sub_menu_project,
sub_menu_edit,
sub_menu_format,
sub_menu_view,
sub_menu_window,
NULL);
toolbar = IupHbox(
btn_new,
btn_open,
btn_save,
IupSetAttributes(IupLabel(NULL), "SEPARATOR=VERTICAL"),
btn_cut,
btn_copy,
btn_paste,
IupSetAttributes(IupLabel(NULL), "SEPARATOR=VERTICAL"),
btn_find,
IupSetAttributes(IupLabel(NULL), "SEPARATOR=VERTICAL"),
bt_wordwrap,
bt_showwhite,
bt_showeol,
NULL);
IupSetAttribute(toolbar, "MARGIN", "5x5");
IupSetAttribute(toolbar, "GAP", "2");
IupSetAttribute(toolbar, "NAME", "TOOLBAR");
IupSetAttribute(toolbar, "NORMALIZESIZE", "VERTICAL");
vbox = IupVbox(
toolbar,
panelSplit,
statusbar,
NULL);
/* Do not use IupAppend because we set childtype=IUP_CHILDNONE */
iupChildTreeAppend(ih, vbox);
IupSetAttributeHandle(ih, "MENU", menu);
IupSetCallback(ih, "CLOSE_CB", (Icallback)close_exit_action_cb);
IupSetCallback(ih, "SHOW_CB", (Icallback)show_cb);
IupSetCallback(ih, "DROPFILES_CB", (Icallback)dropfiles_cb);
IupSetCallback(ih, "K_cN", (Icallback)item_new_action_cb);
IupSetCallback(ih, "K_cO", (Icallback)item_open_action_cb);
IupSetCallback(ih, "K_cS", (Icallback)item_save_action_cb);
IupSetCallback(ih, "K_cP", (Icallback)item_print_action_cb);
IupSetCallback(ih, "K_cF", (Icallback)item_find_action_cb);
IupSetCallback(ih, "K_cH", (Icallback)item_replace_action_cb); /* replace system processing */
IupSetCallback(ih, "K_cG", (Icallback)item_goto_action_cb);
IupSetCallback(ih, "K_cB", (Icallback)item_gotombrace_action_cb);
IupSetCallback(ih, "K_cF2", (Icallback)item_togglemark_action_cb);
IupSetCallback(ih, "K_F2", (Icallback)item_nextmark_action_cb);
IupSetCallback(ih, "K_sF2", (Icallback)item_previousmark_action_cb);
IupSetCallback(ih, "K_F3", (Icallback)find_next_action_cb);
IupSetCallback(ih, "K_cF3", (Icallback)selection_find_next_action_cb);
IupSetCallback(ih, "K_c+", (Icallback)item_zoomin_action_cb);
IupSetCallback(ih, "K_c-", (Icallback)item_zoomout_action_cb);
IupSetCallback(ih, "K_c/", (Icallback)item_restorezoom_action_cb);
IupSetCallback(ih, "K_cEqual", (Icallback)item_zoomin_action_cb);
IupSetCallback(ih, "K_cMinus", (Icallback)item_zoomout_action_cb);
IupSetCallback(ih, "K_cSlash", (Icallback)item_restorezoom_action_cb);
IupSetCallback(ih, "K_cF4", (Icallback)item_close_action_cb);
IupSetCallback(ih, "K_sF4", (Icallback)item_close_action_cb);
iupAttribSet(ih, "_IUP_CONFIG", (char*)IupConfig());
new_file(tabs); /* always keep at least one multitext */
(void)params;
return IUP_NOERROR;
}
Iclass* iupScintillaDlgNewClass(void)
{
Iclass* ic = iupClassNew(iupRegisterFindClass("dialog"));
ic->New = iupScintillaDlgNewClass;
ic->Create = iScintillaDlgCreateMethod;
ic->name = "scintilladlg";
ic->cons = "ScintillaDlg";
ic->nativetype = IUP_TYPEDIALOG;
ic->is_interactive = 1;
ic->childtype = IUP_CHILDNONE;
ic->has_attrib_id = 1; /* has attributes with IDs that must be parsed */
iupClassRegisterCallback(ic, "MARKERCHANGED_CB", "nii");
iupClassRegisterCallback(ic, "SAVEMARKERS_CB", "i");
iupClassRegisterCallback(ic, "RESTOREMARKERS_CB", "i");
iupClassRegisterCallback(ic, "NEWTEXT_CB", "i");
iupClassRegisterCallback(ic, "CLOSETEXT_CB", "i");
iupClassRegisterCallback(ic, "NEWFILENAME_CB", "ss");
iupClassRegisterCallback(ic, "LOADFILE_CB", "i");
iupClassRegisterCallback(ic, "SAVEFILE_CB", "i");
iupClassRegisterCallback(ic, "CONFIGSAVE_CB", "i");
iupClassRegisterCallback(ic, "CONFIGLOAD_CB", "i");
iupClassRegisterCallback(ic, "EXIT_CB", "");
iupClassRegisterAttribute(ic, "SUBTITLE", NULL, iScintillaDlgSetSubTitleAttrib, IUPAF_SAMEASSYSTEM, "Notepad", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "UPDATETITLE", NULL, iScintillaDlgSetUpdateTitleAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CONFIG", iScintillaDlgGetConfigAttrib, iScintillaDlgSetConfigAttrib, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CONFIG_HANDLE", iScintillaDlgGetConfigHandleAttrib, iScintillaDlgSetConfigHandleAttrib, NULL, NULL, IUPAF_IHANDLE | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NEWFILE", NULL, iScintillaDlgSetOpenFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "OPENFILE", NULL, iScintillaDlgSetOpenFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SAVEFILE", NULL, iScintillaDlgSetSaveFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "CLOSEFILE", NULL, iScintillaDlgSetCloseFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "OPENPROJECT", NULL, iScintillaDlgSetOpenProjectAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FORCECLOSEFILE", NULL, iScintillaDlgSetForceCloseFileAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EXTRAFILTERS", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "DEFAULT_EXT", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "PROJECT_EXT", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "TOGGLEMARKER", NULL, iScintillaDlgSetToggleMarkerAttribId, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
return ic;
}
Ihandle* IupScintillaDlg(void)
{
return IupCreate("scintilladlg");
}