static OldList defines { };
static OldList imports { };
static NameSpace globalData;
-static OldList excludedSymbols { offset = (uint)&((Symbol)0).left };
+static OldList excludedSymbols { offset = (uint)&((Symbol)0).left };
+static bool readOnly;
+
+define app = (GuiApplication)__thisModule.application;
#define UTF8_NUM_BYTES(x) (__extension__({ byte b = x; (b & 0x80 && b & 0x40) ? ((b & 0x20) ? ((b & 0x10) ? 4 : 3) : 2) : 1; }))
enum CodeObjectType { typeClass, typeData, typeMethod, typeEvent, typeProperty, typeNameSpace, typeDataType, typeEnumValue, typeDataPrivate, typeMethodPrivate, typePropertyPrivate };
-static char * iconNames[CodeObjectType] =
+static char * iconNames[CodeObjectType] =
{
"<:ecere>constructs/class.png",
"<:ecere>constructs/data.png",
DocPrintType(type.returnType, string, false, fullName);
strcat(string, " ");
}
-
+
// DANGER: Testing This
if(printName)
{
strcat(size, arrayType.enumClass.string);
else if(arrayType.arraySizeExp)
PrintExpression(arrayType.arraySizeExp, size);
- //sprintf(string, "%s[%s]", baseType, size);
+ //sprintf(string, "%s[%s]", baseType, size);
strcat(size, "]");
arrayType = arrayType.arrayType;
strcpy(size, type.enumClass.string);
else if(type.arraySizeExp)
PrintExpression(type.arraySizeExp, size);
- //sprintf(string, "%s[%s]", baseType, size);
+ //sprintf(string, "%s[%s]", baseType, size);
strcat(string, baseType);
strcat(string, "[");
- strcat(string, size);
+ strcat(string, size);
strcat(string, "]");
*/
{
page.Generate(f);
}
+
+ virtual Module GetModule()
+ {
+ return page ? page.GetModule() : null;
+ }
+
+ virtual NameSpace * GetNameSpace()
+ {
+ return page ? page.GetNameSpace() : null;
+ }
};
enum DocumentationType
case example: strcat(fileName, "example"); break;
case seeAlso: strcat(fileName, "seeAlso"); break;
case returnValue: strcat(fileName, "returnValue"); break;
- case enumerationValue:
+ case enumerationValue:
strcat(fileName, "enumeration values/");
strcat(fileName, ((NamedLink)data).name);
break;
if(!contents[c])
delete contents;
}
- if(editing && !contents)
+ if(editing && !contents && !readOnly)
contents = CopyString($"[Add Text]");
return contents;
}
{
NameSpace * nameSpace;
Module module;
-
+
+ Module GetModule()
+ {
+ return module;
+ }
+
+ NameSpace * GetNameSpace()
+ {
+ return nameSpace;
+ }
+
void Generate(File f)
{
char string[1024];
strcpy(nsName, temp);
ns = ns->parent;
}
- if(nsName[0])
+ if(nsName[0])
f.Printf($"Parent namespace: <a href=\"api://%p\" style=\"text-decoration: none;\">%s</a><br>\n", nameSpace->parent, nsName);
f.Printf("<br>");
if(first)
{
f.Printf($"<H3>Sub Namespaces</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
f.Printf("<TR>");
if(first)
{
f.Printf($"<a name=Classes></a><H3>Classes</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
if(first)
{
f.Printf($"<a name=Functions></a><H3>Functions</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
f.Printf("<TR>");
if(first)
{
f.Printf($"<a name=Definitions></a><H3>Definitions</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
f.Printf("<TR>");
{
Class cl;
+ Module GetModule()
+ {
+ return cl.module;
+ }
+
+ NameSpace * GetNameSpace()
+ {
+ return cl.nameSpace;
+ }
+
void Generate(File f)
{
char string[1024];
f.Printf("<FONT FACE=\"Arial\" SIZE=\"6\">%s</FONT><br><br>\n", name);
f.Printf($"Module: <a href=\"api://%p\" style=\"text-decoration: none;\">%s</a><br>\n", (module && module.name) ? module : null, (!module || !module.name || !strcmp(nsName, "ecere::com")) ? "ecereCOM" : module.name);
- if(nsName[0])
+ if(nsName[0])
f.Printf($"Namespace: <a href=\"api://%p\" style=\"text-decoration: none;\">%s</a><br>\n", cl.nameSpace, nsName);
{
}
f.Printf($"Type: %s<br>\n", classType);
}
-
+
if(cl.type != systemClass && cl.base)
{
f.Printf($"Base Class: ");
if(enumeration.values.first)
{
NamedLink item;
-
+
f.Printf($"<a name=EnumerationValues></a><H3>Enumeration Values</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
for(item = enumeration.values.first; item; item = item.next)
{
}
else
dataClass = base;
-
+
f.Printf("<TR>");
f.Printf("<TD valign=top height=22 nowrap=1><a name=%p></a><img valign=center src=\"%s\"> %s</TD>", item, iconNames[typeEnumValue], item.name);
if(dataClass.type == systemClass)
if(cl.conversions.first)
{
f.Printf($"<a name=Conversions></a><H3>Conversions</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
for(prop = cl.conversions.first; prop; prop = prop.next)
{
if((prop.memberAccess == publicAccess || (prop.memberAccess == privateAccess && showPrivate)) && prop.name)
if(name) name += 2; else name = prop.name;
f.Printf("<TR>");
-
+
string[0] = 0;
DocPrintType(type, string, true, false);
-
+
f.Printf("<TD valign=top height=22 nowrap=1><a name=%p></a><img valign=center src=\"%s\"> %s</TD>", prop, iconNames[typeDataType], string);
if(desc)
{
f.Printf("<TD valign=top height=22>%s</TD>", desc);
delete desc;
}
-
+
f.Printf("</TR>\n");
-
+
FreeType(type);
}
}
if(first)
{
f.Printf($"<a name=Members></a><H3>Properties and Members</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
if(first)
{
f.Printf($"<a name=VirtualMethods></a><H3>Virtual Methods</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
if(!method.dataType)
if(first)
{
f.Printf($"<a name=Methods></a><H3>Non-Virtual Methods</H3><br><br>\n");
- f.Printf("<TABLE >\n");
+ f.Printf("<TABLE>\n");
first = false;
}
f.Printf("<TD valign=top height=22>%s</TD>", desc);
delete desc;
}
-
+
f.Printf("</TR><br>\n");
}
}
{
f.Printf($"<H3>Example</H3><br>\n");
f.Printf($"<FONT face=\"Courier New\">\n");
- f.Printf("<br><TABLE >\n");
+ f.Printf("<br><TABLE>\n");
if(editing)
{
char fileName[MAX_LOCATION];
delete remarksDoc;
}
}
-
+
if(cl.type != systemClass)
{
bool first = true;
class APIPageMethod : APIPage
{
Method method;
+
+ Module GetModule()
+ {
+ return method._class.module;
+ }
+
+ NameSpace * GetNameSpace()
+ {
+ return method._class.nameSpace;
+ }
+
void Generate(File f)
{
Class cl = method._class;
FigureFileName(fileName, module, methodDoc, method, parameter, param);
f.Printf("<TD valign=top height=22><a style=\"text-decoration:none;\" href=\"edit://%s\">", fileName);
f.Puts(desc);
- f.Printf("s</a> </TD>\n");
+ f.Printf("</a></TD>\n");
}
else
f.Printf("<TD valign=top height=22>%s </TD>\n", desc);
delete desc;
}
-
+
f.Printf("</TR>\n");
}
}
{
f.Printf($"<H3>Example</H3><br>\n");
f.Printf($"<FONT face=\"Courier New\">\n");
- f.Printf("<br><TABLE >\n");
+ f.Printf("<br><TABLE>\n");
if(editing)
{
char fileName[MAX_LOCATION];
}
else
f.Printf("<br>%s\n", method, seeAlsoDoc);
-
+
f.Printf("<br><br>\n");
delete seeAlsoDoc;
}
class APIPageFunction : APIPage
{
GlobalFunction function;
+
+ Module GetModule()
+ {
+ return function.module;
+ }
+
+ NameSpace * GetNameSpace()
+ {
+ return function.nameSpace;
+ }
+
void Generate(File f)
{
char string[1024];
char fileName[MAX_LOCATION];
FigureFileName(fileName, module, functionDoc, function, parameter, param);
f.Printf("<TD valign=top height=22><a style=\"text-decoration:none;\" href=\"edit://%s\">", fileName);
- f.Puts(desc);
+ if(desc)
+ f.Puts(desc);
f.Printf("</a> </TD>\n");
}
else
{
f.Printf($"<H3>Example</H3><br>\n");
f.Printf($"<FONT face=\"Courier New\">\n");
- f.Printf("<br><TABLE >\n");
+ f.Printf("<br><TABLE>\n");
if(editing)
{
char fileName[MAX_LOCATION];
APIPage page;
char fileName[MAX_LOCATION];
-
+
strcpy(nsName, parentName ? parentName : "");
if(nameSpace->name)
{
{
for(nameSpace = mainNameSpace ; nameSpace; nameSpace = (nameSpace == mainNameSpace) ? comNameSpace : null)
{
- if(nameSpace->functions.first)
+ if(nameSpace->functions.first)
{
BTNamedLink link;
GlobalFunction fn;
}
}
}
-
+
if(mainNameSpace.defines.first || (comNameSpace && comNameSpace.defines.first))
{
for(nameSpace = mainNameSpace ; nameSpace; nameSpace = (nameSpace == mainNameSpace) ? comNameSpace : null)
}
else
f.Printf("<TD valign=top height=22></TD>");
-
+
if(member.type != normalMember)
{
DataMember subMember;
bool NotifySelect(MenuItem selection, Modifiers mods)
{
- SettingsDialog { master = this }.Modal(); // Open the settings dialog to allow the user to change the directory for the eCdoc files
+ if(SettingsDialog { master = this }.Modal() == ok) // Open the settings dialog to allow the user to change the directory for the eCdoc files
+ {
+ // Refresh docs
+ view.edit = false;
+ view.Destroy(0);
+ view.Create();
+ }
return true;
}
};
FreeExcludedSymbols(excludedSymbols);
::defines.Free(FreeModuleDefine);
imports.Free(FreeModuleImport);
-
+
FreeGlobalData(globalData);
FreeTypeData(componentsApp);
FreeIncludeFiles();
if(extension[0] && strcmpi(extension, "so") && strcmpi(extension, "dll"))
componentsApp.name = CopyString(filePath);
-
+
for(module = componentsApp.allModules.first; module; module = module.next)
{
if(module.name && (!strcmp(module.name, "ecere") || !strcmp(module.name, "ecereCOM")))
}
else if(!view.created)
view.Create();
-
+
{
page = row.GetData(null);
if(page && page.page)
bool OnCreate()
{
TempFile f { };
+
page = mainForm.browser.currentRow.GetData(null);
if(page)
{
+ // Writability test
+ {
+ char docFile[MAX_LOCATION];
+ Archive archive;
+ Module module = page ? page.GetModule() : null;
+ NameSpace * ns = page ? page.GetNameSpace() : null;
+
+ sprintf(docFile, "%s/%s.eCdoc", settings.docDir, (!module || !module.name || (ns && ns->name && !strcmp(ns->name, "namespaces/ecere/namespaces/com"))) ? "ecereCOM" : module.name);
+
+ if(FileExists(docFile))
+ {
+ archive = ArchiveOpen(docFile, { true } );
+ readOnly = archive == null;
+ delete archive;
+ }
+ else
+ {
+ readOnly = true;
+ archive = ArchiveOpen(docFile, { true } );
+ if(archive)
+ {
+ // Must create root directory on archive creation
+ ArchiveDir dir = archive.OpenDirectory("", null, replace);
+ if(dir)
+ readOnly = false;
+ delete dir;
+ }
+ delete archive;
+ }
+ }
+
page.Generate(f);
f.Seek(0, start);
OpenFile(f, null);
char fileName[MAX_FILENAME];
char directory[MAX_LOCATION];
char * location;
- Archive archive;
- SplitArchivePath(editString, archiveFile, &location);
- GetLastDirectory(location, fileName);
- StripLastDirectory(location, directory);
- archive = ArchiveOpen(archiveFile, { true } );
- // if(archive)
+ Archive archive = null;
+ if(SplitArchivePath(editString, archiveFile, &location))
+ {
+ GetLastDirectory(location, fileName);
+ StripLastDirectory(location, directory);
+ archive = ArchiveOpen(archiveFile, { true } );
+ }
{
TempFile f { };
ArchiveDir dir = archive ? archive.OpenDirectory(directory, null, replace) : null;
if(edit && (!textBlock || overLink != textBlock.parent))
{
- SaveEdit();
+ if(!readOnly)
+ SaveEdit();
HTMLView::OnLeftButtonDown(x, y, mods);
selPosition = curPosition = 0;
selBlock = textBlock;
len = (nextSpace - (text + textPos)) + 1;
else
len = textBlock.textLen - textPos;
-
+
display.FontExtent(textBlock.font.font, text + textPos, len, &w, &th);
if(x + width + w > maxW && x > 0)
len = (nextSpace - (text + textPos)) + 1;
else
len = textBlock.textLen - textPos;
-
+
display.FontExtent(textBlock.font.font, text + textPos, len, &w, &th);
if(x + width + w > maxW && x > 0)
Update(null);
PositionCaret(false);
return false;
- }
+ }
else if(textPos == textBlock.textLen && textBlock.next && textBlock.next.next)
{
startPos = 0;
sx = textBlock.startX;
}
}
-
+
/*if(textBlock.next && textBlock.next.next)
{
textBlock = textBlock.next.next;
break;
}
}
- // No next word found,
+ // No next word found,
if(!found && (c != curPosition || line != textBlock))
{
found = true;
}
}
}
- // No next word found,
+ // No next word found,
if(!found && curPosition > 0)
{
foundAlpha = true;
}
break;
case backSpace:
+ if(readOnly) break;
if(textBlock == selBlock && curPosition == selPosition)
{
if(curPosition)
DeleteSelection();
break;
case del:
+ if(readOnly) break;
if(textBlock != selBlock || curPosition != selPosition)
DeleteSelection();
else if(textBlock.textLen > curPosition)
Block newBlock;
int startY, startX;
+ if(readOnly) break;
DeleteSelection();
block = { type = BR, parent = textBlock.parent, font = textBlock.font };
}
case ctrlX:
case Key { del, shift = true }:
+ if(readOnly) break;
// Cut
CopySelection();
DeleteSelection();
break;
case shiftInsert:
case ctrlV:
- {
- ClipBoard clipBoard { };
- if(clipBoard.Load())
- {
- int c;
- char * text = clipBoard.memory;
- char ch;
- int start = 0;
- Block parent;
- FontEntry font;
+ if(!readOnly)
+ {
+ ClipBoard clipBoard { };
+ if(clipBoard.Load())
+ {
+ int c;
+ char * text = clipBoard.memory;
+ char ch;
+ int start = 0;
+ Block parent;
+ FontEntry font;
- DeleteSelection();
+ DeleteSelection();
- parent = textBlock.parent;
- font = textBlock.font;
+ parent = textBlock.parent;
+ font = textBlock.font;
- for(c = 0; ; c++)
- {
- ch = text[c];
- if(ch == '\n' || ch == '\r' || !ch)
+ for(c = 0; ; c++)
{
- int len = c - start;
- textBlock.text = renew textBlock.text char[textBlock.textLen + 1 + len];
- memmove(textBlock.text + curPosition + len, textBlock.text + curPosition, textBlock.textLen - curPosition + 1);
- memcpy(textBlock.text + curPosition, text + start, len);
- textBlock.textLen += len;
- curPosition += len;
- selPosition = curPosition;
- selBlock = textBlock;
- if(!ch) break;
+ ch = text[c];
+ if(ch == '\n' || ch == '\r' || !ch)
{
- Block block { type = BR, parent = parent, font = font };
- Block newBlock { type = TEXT, parent = parent, font = font };
- int startY = textBlock.startY, startX = textBlock.startX;
- int tw = 0, th = 0;
-
- display.FontExtent(textBlock.font.font, " ", 1, null, &th);
- textBlock.parent.subBlocks.Insert(textBlock, block);
- textBlock.parent.subBlocks.Insert(block, newBlock);
-
- startY += th;
-
- newBlock.textLen = textBlock.textLen - curPosition;
- newBlock.text = new char[newBlock.textLen+1];
- memcpy(newBlock.text, textBlock.text + curPosition, textBlock.textLen - curPosition + 1);
- textBlock.textLen = curPosition;
- textBlock.text[curPosition] = 0;
-
- newBlock.startY = startY;
- newBlock.startX = startX;
- selPosition = curPosition = 0;
+ int len = c - start;
+ textBlock.text = renew textBlock.text char[textBlock.textLen + 1 + len];
+ memmove(textBlock.text + curPosition + len, textBlock.text + curPosition, textBlock.textLen - curPosition + 1);
+ memcpy(textBlock.text + curPosition, text + start, len);
+ textBlock.textLen += len;
+ curPosition += len;
+ selPosition = curPosition;
selBlock = textBlock;
- textBlock = newBlock;
+ if(!ch) break;
+ {
+ Block block { type = BR, parent = parent, font = font };
+ Block newBlock { type = TEXT, parent = parent, font = font };
+ int startY = textBlock.startY, startX = textBlock.startX;
+ int tw = 0, th = 0;
+
+ display.FontExtent(textBlock.font.font, " ", 1, null, &th);
+ textBlock.parent.subBlocks.Insert(textBlock, block);
+ textBlock.parent.subBlocks.Insert(block, newBlock);
+
+ startY += th;
+
+ newBlock.textLen = textBlock.textLen - curPosition;
+ newBlock.text = new char[newBlock.textLen+1];
+ memcpy(newBlock.text, textBlock.text + curPosition, textBlock.textLen - curPosition + 1);
+ textBlock.textLen = curPosition;
+ textBlock.text[curPosition] = 0;
+
+ newBlock.startY = startY;
+ newBlock.startX = startX;
+ selPosition = curPosition = 0;
+ selBlock = textBlock;
+ textBlock = newBlock;
+ }
+ if(ch == '\r' && text[c+1] == '\n') c++;
+ start = c + 1;
}
- if(ch == '\r' && text[c+1] == '\n') c++;
- start = c + 1;
}
+ ComputeMinSizes();
+ ComputeSizes();
+ PositionCaret(true);
+ Update(null);
}
- ComputeMinSizes();
- ComputeSizes();
- PositionCaret(true);
- Update(null);
+ delete clipBoard;
}
- delete clipBoard;
break;
- }
default:
{
// eC BUG HERE: (Should be fixed)
- if(!key.ctrl && !key.alt && ch >= 32 && ch != 128 /*&& ch < 128*/)
+ if(!readOnly && !key.ctrl && !key.alt && ch >= 32 && ch != 128 /*&& ch < 128*/)
{
char string[5];
int len = UTF32toUTF8Len(&ch, 1, string, 5);
textBlock.text = renew textBlock.text char[textBlock.textLen + len + 1];
memmove(textBlock.text + curPosition + len, textBlock.text + curPosition, textBlock.textLen - curPosition + 1);
-
+
for(c = 0; c<len; c++)
{
textBlock.text[curPosition] = string[c];
}
selPosition = curPosition;
selBlock = textBlock;
-
+
{
//Clear(html.block);
//CreateForms(html.block);
}
else
maxW = clientSize.w - 10 - sx;
-
+
display.FontExtent(textBlock.font.font, " ", 1, null, &th);
while(textPos < textBlock.textLen)
len = (nextSpace - (text + textPos)) + 1;
else
len = textBlock.textLen - textPos;
-
+
display.FontExtent(textBlock.font.font, text + textPos, len, &w, &th);
if(x + width + w > maxW && x > 0)
}
else
maxW = clientSize.w - 10 - sx;
-
+
display.FontExtent(textBlock.font.font, " ", 1, &space, &th);
//space = space/2+2;
space = 2;
len = (nextSpace - (text + textPos)) + 1;
else
len = textBlock.textLen - textPos;
-
+
display.FontExtent(textBlock.font.font, text + textPos, len, &w, &th);
sx = x + textBlock.startX;
SetExcludedSymbols(&excludedSymbols);
SetDefines(&::defines);
SetImports(&imports);
-
+
SetGlobalData(globalData);
settingsContainer.dataOwner = &settings;
if(os == win32) // if Windows OS then
{
char programFilesDir[MAX_LOCATION];
- char appData[MAX_LOCATION];
+ char appData[MAX_LOCATION];
char homeDrive[MAX_LOCATION];
char winDir[MAX_LOCATION];
GetEnvironment("APPDATA", appData, sizeof(appData));
row.collapsed = false;
#endif
}
+
+ commandThread.Create();
+ return true;
+ }
+
+ bool Cycle(bool idle)
+ {
+ if(quit)
+ mainForm.Destroy(0);
return true;
}
void Terminate()
{
+ PrintLn("Exited");
+ console.Flush();
+ quit = true;
+ if(commandThread.created)
+ {
+ console.CloseInput();
+ console.CloseOutput();
+ app.Unlock();
+ commandThread.Wait();
+ app.Lock();
+ }
+
FreeContext(globalContext);
FreeExcludedSymbols(excludedSymbols);
::defines.Free(FreeModuleDefine);
}
}
+ConsoleFile console { };
MainForm mainForm { };
+bool quit;
+
+Thread commandThread
+{
+ unsigned int Main()
+ {
+ while(!quit)
+ {
+ char command[1024];
+ console.GetLine(command, sizeof(command));
+ if(!quit && command[0])
+ {
+ app.Lock();
+ if(!strcmpi(command, "Activate"))
+ mainForm.Activate();
+ else if(!strcmpi(command, "Quit"))
+ quit = true;
+ app.Unlock();
+ }
+ }
+ return 0;
+ }
+};