#endif
private:
-define guiApp = ((GuiApplication)__thisModule);
+define guiApp = (GuiApplication)((__thisModule).application);
define selectionColor = guiApp.currentSkin.selectionColor; //Color { 10, 36, 106 };
static char * fileIconNames[] =
""
};
-public enum ExplorerFileType
+public enum _FileType
{
none,
treeLoader,
lineNumbers;
-
/*property char *
{
set
}
}*/
- public property bool isFolderType
+ public property bool isFolder
{
get { return this >= folder && this <= share; }
}
- public property bool isFileType
+ public property bool isFile
{
get { return this >= normalFile && this <= opticalMediaImageFile; }
}
- ExplorerFileType ::SelectByExtension(char * extension)
+ _FileType ::SelectByExtension(char * extension)
{
if(!strcmpi(extension, "ews"))
return ewsFile;
}
};
-class ExplorerControl : Window
+class FileSystemBoxBits
+{
+ bool foldersOnly:1, filesOnly:1, details:1, treeBranches:1, previewPictures:1, navigateFolders:1, autoLoad:1;
+ //bool header:1, freeSelect:1, fullRowSelect:1, multiSelect:1, autoScroll:1, alwaysHL : 1, moveRows:1, resizable:1;
+ //bool moveFields:1, clearHeader:1, alwaysEdit:1, collapse:1, treeBranch:1, rootCollapse:1, heightSet:1;
+ //bool sortable:1, noDragging:1, fillLastField:1, expandOnAdd:1;
+};
+
+public class FileSystemBox : Window // should we not derive from ListBox instead?
+/*
+ this stuff from the listbox would be nicely exposed...
+ fullRowSelect = false;
+ treeBranches = true;
+ collapseControl = true;
+ rootCollapseButton = true;
+ sortable = true;
+*/
{
- bool previewPictures;
+ borderStyle = deep;
+ hasHorzScroll = false;
+ hasVertScroll = false;
+
+ menu = Menu { };
+
+public:
+ FileSystemNode root;
+ FileSystemNode selection;
+
+ virtual bool Window::NotifyNodeSelect(FileSystemBox box, FileSystemNode node);
+ virtual bool Window::NotifyNodeOpen(FileSystemBox box, FileSystemNode node);
+
+ property char * path
+ {
+ set
+ {
+ delete path;
+ if(value && value[0])
+ path = CopyString(value);
+ if(locationBox)
+ locationBox.path = value;
+ if(created)
+ Load();
+ }
+
+ get { return path; }
+ //isset { return path && path[0]; }
+ }
+
+ property bool foldersOnly { set { bits.foldersOnly = value; bits.filesOnly = !value; } get { return bits.foldersOnly; } };
+ property bool filesOnly { set { bits.filesOnly = value; bits.foldersOnly = !value; } get { return bits.filesOnly; } };
+ property bool previewPictures { set { bits.previewPictures = value; } get { return bits.previewPictures; } };
+ property char * extensions { set { delete extensions; if(value && value[0]) extensions = CopyString(value); } get { return extensions; } }
+ property bool details { set { bits.details = value; } get { return bits.details; } };
+ property bool treeBranches
+ {
+ set
+ {
+ bits.treeBranches = value;
+ list.treeBranches = value;
+ list.collapseControl = value;
+ list.rootCollapseButton = value;
+ }
+ get { return bits.treeBranches; }
+ };
+ property bool navigateFolders { set { bits.navigateFolders = value; bits.filesOnly = !value; } get { return bits.navigateFolders; } };
+ property bool multiSelect { set { list.multiSelect = value; } get { return list.multiSelect; } };
+ property bool autoLoad { set { bits.autoLoad = value; } get { return bits.autoLoad; } };
+
+ property FileSystemNode node
+ {
+ get
+ {
+ if(!list)
+ return null;
+ if(!list.currentRow)
+ return null;
+ if(!list.currentRow.tag)
+ return null;
+ return (FileSystemNode)list.currentRow.tag;
+ }
+ }
+
+ PathBox locationBox;
+
+ void Select(FileSystemNode node)
+ {
+ if(node.row)
+ {
+ node.EnsureVisible(false);
+ list.SelectRow(node.row);
+ }
+ }
+
+ FileSystemNode SelectLocation(char * location)
+ {
+ int c;
+ char * temp;
+ char step[MAX_LOCATION];
+
+ //StringArray steps { growingFactor = 4 };
+ Array<String> steps { };
+ FileSystemNode result = null;
+ FileSystemNode node = null;
+
+ temp = CopyString(location);
+ while(temp[0])
+ {
+ GetLastDirectory(temp, step);
+ StripLastDirectory(temp, temp);
+ steps.Add(CopyString(step));
+ }
+
+ for(c = steps.count - 1; c >= 0; c--)
+ {
+ char * t = steps[c];
+ node = Find(steps[c], node);
+ if(!node)
+ break;
+ //Select(node);
+ }
+ if(node)
+ {
+ result = node;
+ Select(result);
+ }
+
+ steps.Free();
+ delete temp;
+ delete steps;
+
+ return result;
+ }
- BitmapResource fileIcons[ExplorerFileType];
+ FileSystemNode Find(const char * name, FileSystemNode parent)
+ {
+ FileSystemNode node = null;
+ FileSystemNode result = null;
+ if(!parent/* && !strcmp(name, "/")*/)
+ {
+ DataRow row;
+ for(row = list.firstRow; row; row = row.next)
+ {
+ node = (FileSystemNode)row.tag;
+ if(node.name && !fstrcmp(node.name, name))
+ break;
+ }
+ if(node)
+ result = node;
+ //result = root;
+ }
+ else
+ {
+ FileSystemNode start = parent ? parent : root;
+ if(!start.loaded || !start.childrenLoaded)
+ LoadTreeNode(start);
+ for(node = start.children.first; node; node = node.next)
+ if(node.name && !fstrcmp(node.name, name))
+ break;
+ if(node)
+ result = node;
+ }
+ return result;
+ }
- ExplorerControl()
+ void Refresh()
{
- ExplorerFileType c;
- for(c = 0; c < ExplorerFileType::enumSize; c++)
+ Load();
+ }
+
+private:
+ FileSystemBoxBits bits;
+
+ char * path;
+ char * extensions;
+
+ BitmapResource fileIcons[_FileType];
+
+ FileSystemBox()
+ {
+ char wd[MAX_LOCATION];
+ GetWorkingDir(wd, sizeof(wd));
+ property::path = wd;
+
+ InitFileIcons();
+ list.AddField(nameField);
+ bits.autoLoad = true;
+ }
+ ~FileSystemBox()
+ {
+ delete extensions;
+ delete path;
+ }
+ void InitFileIcons()
+ {
+ _FileType c;
+ for(c = 0; c < _FileType::enumSize; c++)
{
fileIcons[c] = BitmapResource { fileIconNames[c], alphaBlend = true };
AddResource(fileIcons[c]);
}
}
+
+ DataField nameField { dataType = "FileSystemNode", width = 240, userData = this, freeData = false };
+ DataField typeField { header = "Type", dataType = /*"String"*/ "char *", width = 40, freeData = false };
+ DataField sizeField { header = "Size", dataType = "FileSize", width = 96, alignment = right, freeData = false };
+
+ bool OnPostCreate()
+ {
+ if(bits.autoLoad)
+ Load();
+ return true;
+ }
+
+ ListBox list
+ {
+ this;
+
+ borderStyle = none;
+ hasHorzScroll = true;
+ hasVertScroll = true;
+ fullRowSelect = false;
+ sortable = true;
+
+ anchor = Anchor { left = 0, top = 0, right = 0, bottom = 0 };
+
+ // WHY is this not working ?
+ /*void OnResize(int width, int height)
+ {
+ if(vertScroll.visible)
+ nameField.width = width - vertScroll.size.w;
+ else
+ nameField.width = width;
+ }*/
+
+ bool NotifyCollapse(ListBox listBox, DataRow row, bool collapsed)
+ {
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ FileSystemNode child;
+ if(collapsed)
+ {
+ /*
+ for(child = node.children.last; child; child = node.children.last)
+ {
+ listBox.DeleteRow(child.row);
+ child.Free();
+ delete child;
+ }
+ node.childrenLoaded = false;
+ */
+ }
+ else
+ {
+ if(!node.loaded || !node.childrenLoaded)
+ {
+ LoadTreeNode(node);
+ //list.Sort(nameField, 1);
+ //node.
+ }
+ for(child = node.children.first; child && child.next; child = child.next);
+ if(child)
+ child.EnsureVisible(false);
+ }
+ }
+ return true;
+ }
+
+ bool NotifyRightClick(ListBox listBox, int x, int y, Modifiers mods)
+ {
+ DataRow row = listBox.currentRow;
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ if(node)
+ {
+ PopupMenu popup;
+ Menu menu { };
+
+ MenuItem { menu, "Cut\tCtrl+X", t, NotifySelect = null, disabled = false };
+ MenuItem { menu, "Copy\tCtrl+C", c, NotifySelect = null, disabled = false };
+ MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /*!clipboard*/ };
+ MenuItem { menu, "Delete\tDel", d, NotifySelect = null, disabled = false };
+ //MenuDivider { menu };
+
+ popup = PopupMenu
+ {
+ master = this, menu = menu,
+ position = {
+ x + clientStart.x + absPosition.x - guiApp.desktop.position.x,
+ y + clientStart.y + absPosition.y - guiApp.desktop.position.y }
+ };
+ popup.Create();
+ }
+ }
+ return true;
+ }
+
+ bool NotifySelect(ListBox listBox, DataRow row, Modifiers mods)
+ {
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ NotifyNodeSelect(listBox.parent.master, this, node);
+ selection = node;
+ }
+ return true;
+ }
+
+ bool NotifyEditing(ListBox listBox, DataRow row)
+ {
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ }
+ return true;
+ }
+
+ bool NotifyEdited(ListBox listBox, DataRow row)
+ {
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ }
+ return true;
+ }
+
+ bool NotifyEditDone(ListBox listBox, DataRow row)
+ {
+ if(row)
+ {
+ FileSystemNode node = (FileSystemNode)row.tag;
+ }
+ return true;
+ }
+
+ bool NotifyDoubleClick(ListBox listBox, int x, int y, Modifiers mods)
+ {
+ bool result = !(selection && selection.type.isFolder && bits.navigateFolders);
+ OpenNode();
+ return result;
+ }
+
+ bool NotifyKeyDown(ListBox listBox, DataRow row, Key key, unichar ch)
+ {
+ bool result;
+ if((SmartKey)key == enter)
+ result = OpenNode();
+ else
+ result = true;
+ return true;
+ }
+ };
+
+ bool OpenNode()
+ {
+ bool result;
+ if(selection && selection.type.isFolder && bits.navigateFolders)
+ property::path = selection.path;
+ result = NotifyNodeOpen(this.master, this, selection);
+ return result;
+ }
+
+ // Edit Menu
+ Menu editMenu { menu, "Edit", e };
+ MenuItem itemEditCut
+ {
+ editMenu, "Cut\tCtrl+X", t, disabled = true;
+
+ bool NotifySelect(MenuItem selection, Modifiers mods)
+ {
+ //EditCut();
+ return true;
+ }
+ };
+ MenuItem itemEditCopy
+ {
+ editMenu, "Copy\tCtrl+C", c, disabled = true;
+
+ bool NotifySelect(MenuItem selection, Modifiers mods)
+ {
+ //EditCopy();
+ return true;
+ }
+ };
+ MenuItem itemEditPaste
+ {
+ editMenu, "Paste\tCtrl+V", p;
+
+ bool NotifySelect(MenuItem selection, Modifiers mods)
+ {
+ //EditPaste();
+ return true;
+ }
+ };
+ MenuItem itemEditDelete
+ {
+ editMenu, "Delete\tDel", d, disabled = true;
+
+ bool NotifySelect(MenuItem selection, Modifiers mods)
+ {
+ //EditDelete();
+ return true;
+ }
+ };
+
+ // WHY is this crashing ?
+ /*void OnResize(int width, int height)
+ {
+ if(this && nameField)
+ nameField.width = width - 80;
+ }*/
+
+ void Load()
+ {
+ // TODO: fix this!
+ // this is crashing in for designer when details = true // can't save the file, always yields a crash
+ /*if(list && created)
+ {
+ list.ClearFields();
+ list.AddField(nameField);
+ if(bits.details)
+ {
+ list.AddField(typeField);
+ list.AddField(sizeField);
+ }
+ }*/
+ if(bits.treeBranches)
+ LoadTree();
+ else
+ LoadList();
+ }
+
+ void LoadList()
+ {
+ FileListing listing { path, extensions = extensions };
+
+ list.Clear();
+ while(listing.Find())
+ {
+ if((!bits.foldersOnly && !bits.filesOnly) ||
+ (bits.foldersOnly && listing.stats.attribs.isDirectory) ||
+ (bits.filesOnly && listing.stats.attribs.isFile))
+ {
+ FileSystemNode node = MakeFileSystemNode(listing.stats, listing.name, listing.path, bits.previewPictures, displaySystem);
+ AddNode(node);
+ }
+ }
+ list.Sort(nameField, 1);
+ }
+
+ void LoadTree()
+ {
+ bool isRoot = !strcmp(path, "/");
+ //char startPath[MAX_LOCATION];
+ FileSystemNode parent;
+ FileSystemNode node;
+ FileListing listing { path, extensions = extensions };
+
+ /*if(!path)
+ GetWorkingDir(startPath, sizeof(startPath));
+ else
+ strcpy(path, startPath);*/
+
+ list.Clear();
+
+ delete root;
+ #ifdef __WIN32__
+ if(isRoot)
+ {
+ root = FileSystemNode { loaded = true, childrenLoaded = true };
+ AddTreeNode(root, true, false, null);
+ while(listing.Find())
+ {
+ int len = strlen(listing.name);
+ char info[MAX_LOCATION];
+ char name[MAX_LOCATION];
+ if(listing.stats.attribs.isDrive &&
+ len > 3 && !strncmp(&listing.name[1], ": [", 3))
+ {
+ strncpy(name, listing.name, 2);
+ name[2] = 0;
+ strncpy(info, &listing.name[4], len - 5);
+ info[len - 5] = 0;
+ }
+ else
+ {
+ strcpy(name, listing.name);
+ info[0] = 0;
+ }
+
+ parent = MakeFileSystemNode(listing.stats, name, listing.path, bits.previewPictures, displaySystem);
+ if(info[0])
+ parent.info = CopyString(info);
+ parent.loaded = true;
+ AddTreeNode(parent, !listing.stats.attribs.isDirectory, listing.stats.attribs.isDirectory, root);
+ if(!listing.stats.attribs.isDirectory)
+ parent.childrenLoaded = true;
+ }
+
+ node = FileSystemNode { name = msNetwork, type = network };
+ AddTreeNode(node, false, true, null);
+ node.row.collapsed = true;
+ }
+ else
+ #endif
+ {
+ root = MakeFileSystemNode(FileStats { attribs = FileExists(path)}, path, path, bits.previewPictures, displaySystem);
+ AddTreeNode(root, false, true, null);
+ LoadTreeNode(root);
+ }
+
+ if(isRoot)
+ {
+ root.type = computer;
+ root.label = rootName;
+ }
+
+ list.Sort(nameField, 1);
+ list.SelectRow(root.row);
+ }
+
+ void LoadTreeNode(FileSystemNode node)
+ {
+ if(!node.loaded)
+ {
+ char path[MAX_LOCATION];
+ node.GetPath(path);
+ {
+ FileListing listing { path, extensions = extensions };
+ if(node.children.count == 1)
+ DeleteNode(node.children.first);
+
+ while(listing.Find())
+ {
+ if(!listing.stats.attribs.isRemovable && ((!bits.foldersOnly && !bits.filesOnly) ||
+ (bits.foldersOnly && listing.stats.attribs.isDirectory) ||
+ (bits.filesOnly && listing.stats.attribs.isFile)))
+ {
+ FileSystemNode child = MakeFileSystemNode(listing.stats, listing.name, listing.path, bits.previewPictures, displaySystem);
+ AddTreeNode(child, true, false, node);
+ NodeChildLoad(child, node);
+ }
+ }
+ }
+ node.childrenLoaded = true;
+ node.loaded = true;
+ node.row.SortSubRows(false);
+ }
+ else if(!node.childrenLoaded)
+ {
+ FileSystemNode child;
+ if(node.children.first)
+ {
+ for(child = node.children.first; child; child = child.next)
+ {
+ if(!child.loaded)
+ LoadTreeNode(child);
+ else if(!child.childrenLoaded)
+ NodeChildLoad(child, node);
+ }
+ node.childrenLoaded = true;
+ node.row.SortSubRows(false);
+ }
+ }
+ }
+
+ void NodeChildLoad(FileSystemNode parent, FileSystemNode node)
+ {
+ char path[MAX_LOCATION];
+ parent.GetPath(path);
+ {
+ bool added = false;
+ FileListing listing { path, extensions = extensions };
+ while(listing.Find())
+ {
+ if((!bits.foldersOnly && !bits.filesOnly) ||
+ (bits.foldersOnly && listing.stats.attribs.isDirectory) ||
+ (bits.filesOnly && listing.stats.attribs.isFile))
+ {
+ FileSystemNode child = MakeFileSystemNode(listing.stats, listing.name, listing.path, bits.previewPictures, displaySystem);
+ AddTreeNode(child, listing.stats.attribs.isFile, !listing.stats.attribs.isFile, parent);
+ added = true;
+ }
+ }
+ if(!added)
+ added = true;
+ }
+ parent.childrenLoaded = true;
+ }
+
+ void AddNode(FileSystemNode node)
+ {
+ DataRow row = list.AddRow();
+ row.tag = (int)node;
+ row.SetData(nameField, node);
+ if(bits.details)
+ {
+ row.SetData(typeField, node.extension);
+ row.SetData(sizeField, (void *)node.stats.size);
+ }
+ }
+
+ void AddTreeNode(FileSystemNode node, bool loaded, bool addLoader, FileSystemNode addTo)
+ {
+ DataRow row = (addTo && addTo.row) ? addTo.row.AddRow() : list.AddRow();
+ if(addTo)
+ {
+ node.parent = addTo;
+ node.indent = addTo.indent + 1;
+ addTo.children.Add(node);
+ }
+ row.tag = (int)node;
+ node.row = row;
+ row.SetData(null, node);
+ if(bits.details)
+ {
+ row.SetData(typeField, node.extension);
+ row.SetData(sizeField, (void *)node.stats.size);
+ }
+
+ node.loaded = loaded;
+ if(addLoader)
+ //AddTreeNode(FileSystemNode { }, false, false, node); // why would this create a compile error?
+ AddTreeNode(FileSystemNode { type = none }, false, false, node);
+
+ if(node.indent > 0)
+ row.collapsed = true;
+ else if(node.type == folder)
+ node.type = folderOpen;
+ }
+
+ void DeleteNode(FileSystemNode node)
+ {
+ FileSystemNode child;
+ for(; (child = node.children.first); )
+ DeleteNode(child);
+ list.DeleteRow(node.row);
+ node.Delete();
+ }
}
-class ExplorerView : ExplorerControl
+/*
+#if 0
+class ExplorerView : FileSystemBox
{
borderStyle = none;
hasHorzScroll = false;
hasVertScroll = false;
- virtual void Load(ExplorerFileBranch parent);
+ virtual void Load(FileSystemNode parent);
virtual void Refresh();
virtual void LaunchNotifyItemSelect(Window master, ExplorerView view, ExplorerFileItem item, ExplorerFileItemArray selectedItems)
{
}
}
+#endif
+#if 0
class ExplorerViewList : ExplorerView
{
- ExplorerFileBranch location;
+ FileSystemNode location;
public:
Load(location);
}
- void Load(ExplorerFileBranch location)
+ void Load(FileSystemNode location)
{
char path[MAX_LOCATION];
this.location = location;
}
}
}
+#endif
+#if 0
class ExplorerViewDetails : ExplorerView
{
list.hasHeader = true;
list.resizable = true;
list.sortable = true;
- ExplorerFileBranch location;
+ FileSystemNode location;
public:
DataField nameField { header = "Name", dataType = "ExplorerFileItem", width = 304, editable = true, userData = this };
- DataField typeField { header = "Type", dataType = /*"String"*/ "char *", width = 40 };
+ DataField typeField { header = "Type", dataType = /-*"String"*-/ "char *", width = 40 };
DataField sizeField { header = "Size", dataType = "FileSize", width = 96, alignment = right };
ExplorerViewDetails()
Load(location);
}
- void Load(ExplorerFileBranch location)
+ void Load(FileSystemNode location)
{
char path[MAX_LOCATION];
this.location = location;
}
}
}
+#endif
+#if 0
class ExplorerViewIcons : ExplorerView
{
- ExplorerFileBranch location;
+ FileSystemNode location;
public:
Load(location);
}
- void Load(ExplorerFileBranch location)
+ void Load(FileSystemNode location)
{
char path[MAX_LOCATION];
this.location = location;
}
}
}
+#endif
+#if 0
class ExplorerViewCards : ExplorerView
{
- ExplorerFileBranch location;
+ FileSystemNode location;
public:
Load(location);
}
- void Load(ExplorerFileBranch location)
+ void Load(FileSystemNode location)
{
char path[MAX_LOCATION];
this.location = location;
}
}
}
+#endif
+#if 0
public class BitmapArray : RedjArray
{
type = class(Bitmap);
size = 0;
}
}
+#endif
+#if 0
class ExplorerViewShowcase : ExplorerView
{
list.anchor = Anchor { left = 0, top = 0, bottom = 0 };
list.size = Size { w = 200 };
- ExplorerFileBranch location;
+ FileSystemNode location;
public:
Load(location);
}
- void Load(ExplorerFileBranch location)
+ void Load(FileSystemNode location)
{
char path[MAX_LOCATION];
this.location = location;
}
}
}
+#endif
-class ExplorerTree : ExplorerControl
+#if 0
+class ExplorerTree : FileSystemBox
{
hasHorzScroll = false;
hasVertScroll = false;
public:
- DataField nameField { dataType = "ExplorerFileBranch", width = 240, userData = this };
+ DataField nameField { dataType = "FileSystemNode", width = 240, userData = this };
- ExplorerFileBranch root;
- ExplorerFileBranch selection;
+ FileSystemNode root;
+ FileSystemNode selection;
- virtual bool Window::NotifyBranchSelect(ExplorerTree tree, ExplorerFileBranch branch);
+ virtual bool Window::NotifyNodeSelect(ExplorerTree tree, FileSystemNode node);
- property ExplorerFileBranch branch
+ property FileSystemNode node
{
get
{
return null;
if(!tree.currentRow.tag)
return null;
- return (ExplorerFileBranch)tree.currentRow.tag;
+ return (FileSystemNode)tree.currentRow.tag;
}
}
- void Select(ExplorerFileBranch branch)
+ void Select(FileSystemNode node)
{
- if(branch.row)
+ if(node.row)
{
- branch.EnsureVisible(false);
- tree.SelectRow(branch.row);
+ node.EnsureVisible(false);
+ tree.SelectRow(node.row);
}
}
- ExplorerFileBranch Find(const char * name, ExplorerFileBranch parent)
+ FileSystemNode Find(const char * name, FileSystemNode parent)
{
- ExplorerFileBranch branch;
- ExplorerFileBranch start = parent ? parent : root;
+ FileSystemNode node;
+ FileSystemNode start = parent ? parent : root;
if(!start.loaded || !start.childrenLoaded)
- BranchLoad(start, tree);
- for(branch = start.children.first; branch; branch = branch.next)
- if(branch.name && !strcmpi(branch.name, name))
- return branch;
+ LoadTreeNode(start, tree);
+ for(node = start.children.first; node; node = node.next)
+ if(node.name && !strcmpi(node.name, name))
+ return node;
return null;
}
hasHorzScroll = true;
hasVertScroll = true;
fullRowSelect = false;
- treeBranches = true;
+ treeNodees = true;
collapseControl = true;
rootCollapseButton = true;
anchor = Anchor { left = 0, top = 0, right = 0, bottom = 0 };
// WHY is this not working ?
- /*void OnResize(int width, int height)
+ /-*void OnResize(int width, int height)
{
if(vertScroll.visible)
nameField.width = width - vertScroll.size.w;
else
nameField.width = width;
- }*/
+ }*-/
bool NotifyCollapse(ListBox listBox, DataRow row, bool collapsed)
{
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
- ExplorerFileBranch child;
+ FileSystemNode node = (FileSystemNode)row.tag;
+ FileSystemNode child;
if(collapsed)
{
- /*
- for(child = branch.children.last; child; child = branch.children.last)
+ /-*
+ for(child = node.children.last; child; child = node.children.last)
{
listBox.DeleteRow(child.row);
child.Free();
delete child;
}
- branch.childrenLoaded = false;
- */
+ node.childrenLoaded = false;
+ *-/
}
else
{
- if(!branch.loaded || !branch.childrenLoaded)
- BranchLoad(branch, tree);
- for(child = branch.children.first; child && child.next; child = child.next);
+ if(!node.loaded || !node.childrenLoaded)
+ LoadTreeNode(node, tree);
+ for(child = node.children.first; child && child.next; child = child.next);
if(child)
child.EnsureVisible(false);
}
DataRow row = listBox.currentRow;
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
- if(branch)
+ FileSystemNode node = (FileSystemNode)row.tag;
+ if(node)
{
PopupMenu popup;
Menu menu { };
MenuItem { menu, "Cut\tCtrl+X", t, NotifySelect = null, disabled = false };
MenuItem { menu, "Copy\tCtrl+C", c, NotifySelect = null, disabled = false };
- MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /*!clipboard*/ };
+ MenuItem { menu, "Paste\tCtrl+V", p, NotifySelect = null, disabled = false /-*!clipboard*-/ };
MenuItem { menu, "Delete\tDel", d, NotifySelect = null, disabled = false };
//MenuDivider { menu };
{
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
- NotifyBranchSelect(listBox.parent.master, this, branch);
- selection = branch;
+ FileSystemNode node = (FileSystemNode)row.tag;
+ NotifyNodeSelect(listBox.parent.master, this, node);
+ selection = node;
}
return true;
}
{
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
+ FileSystemNode node = (FileSystemNode)row.tag;
}
return true;
}
{
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
+ FileSystemNode node = (FileSystemNode)row.tag;
}
return true;
}
{
if(row)
{
- ExplorerFileBranch branch = (ExplorerFileBranch)row.tag;
+ FileSystemNode node = (FileSystemNode)row.tag;
}
return true;
}
};
// WHY is this crashing ?
- /*void OnResize(int width, int height)
+ /-*void OnResize(int width, int height)
{
if(this && nameField)
nameField.width = width - 80;
- }*/
+ }*-/
ExplorerTree()
{
void Load()
{
- ExplorerFileBranch parent;
- ExplorerFileBranch branch;
+ FileSystemNode parent;
+ FileSystemNode node;
FileListing listing { "/" };
tree.Clear();
- root = ExplorerFileBranch { type = computer, loaded = true, childrenLoaded = true };
+ root = FileSystemNode { type = computer, loaded = true, childrenLoaded = true };
#ifdef __WIN32__
root.name = rootName;
#else
root.name = "/";
#endif
- AddBranch(root, true, false, null, tree);
+ AddTreeNode(root, true, false, null, tree);
// How can this make sense for linux?
#ifdef __WIN32__
info[0] = 0;
}
- parent = MakeFileBranch(listing.stats, name);
+ parent = MakeFileSystemNode(listing.stats, name);
if(info[0])
parent.info = CopyString(info);
parent.loaded = true;
- AddBranch(parent, !listing.stats.attribs.isDirectory, listing.stats.attribs.isDirectory, root, tree);
+ AddTreeNode(parent, !listing.stats.attribs.isDirectory, listing.stats.attribs.isDirectory, root, tree);
if(!listing.stats.attribs.isDirectory)
parent.childrenLoaded = true;
}
-
- branch = ExplorerFileBranch { name = msNetwork, type = network };
- AddBranch(branch, false, true, null, tree);
- branch.row.collapsed = true;
+ #endif
+ node = FileSystemNode { name = msNetwork, type = network };
+ AddTreeNode(node, false, true, null, tree);
+ node.row.collapsed = true;
tree.Sort(nameField, 1);
tree.SelectRow(root.row);
- #endif
}
+}
-/*
+#if 0
public class ClipBoardFiles
{
}
}
+/-*
Private Type DROPFILES
pFiles As Long
pt As POINTAPI
SetClipboardData CF_HDROP, hGlobal 'put files to the clipboard
End If
-
+*-/
bool SaveFile(const char * filePath)
{
}
-*/
-
-}
+#endif
-/*public class FileTreeBranchBSArray : ArrayBinarySorted
+#if 0
+public class FileTreeNodeBSArray : ArrayBinarySorted
{
- type = class(ExplorerFileBranch);
+ type = class(FileSystemNode);
public:
- ExplorerFileBranch * const _;
- BSloc Add(ExplorerFileBranch item)
+ FileSystemNode * const _;
+ BSloc Add(FileSystemNode item)
{
BSloc result = Find(item);
if(!result.valid)
}
return result;
}
- BSloc Remove(ExplorerFileBranch item)
+ BSloc Remove(FileSystemNode item)
{
}
-}*/
+}
+#endif
-/*public class FileTreeBranchArray : RedjArray
+#if 0
+public class FileTreeNodeArray : RedjArray
{
- type = class(ExplorerFileBranch);
+ type = class(FileSystemNode);
public:
- ExplorerFileBranch * const _;
- ExplorerFileBranch * Add(ExplorerFileBranch item)
+ FileSystemNode * const _;
+ FileSystemNode * Add(FileSystemNode item)
{
uint pos = _count;
Append(1);
_[pos] = item;
return &_[pos];
}
- ExplorerFileBranch * AddBefore(uint position, ExplorerFileBranch item)
+ FileSystemNode * AddBefore(uint position, FileSystemNode item)
{
Insert(position, 1);
_[position] = item;
return &_[position];
}
-}*/
+}
+#endif
+#if 0
public class ExplorerFileItem : struct
{
char * path;
char * name;
char * info;
char * extension;
- ExplorerFileType type;
+ _FileType type;
int indent;
Bitmap bitmap;
- void OnDisplay(Surface surface, int x, int y, int width, ExplorerControl control, Alignment alignment, DataDisplayFlags displayFlags)
+ void OnDisplay(Surface surface, int x, int y, int width, FileSystemBox control, Alignment alignment, DataDisplayFlags displayFlags)
{
int indentSize = (displayFlags.dropBox) ? 0 : 10;
int textOffset;
ExplorerFileItem item { };
- //if(attribs.isFile) // TODO fix this in ecere
+ //if(stats.attribs.isFile) // -- should work now
if(attribs.isDirectory)
{
extension[0] = 0;
//strupr(extension);
strlwr(extension);
- item.type = ExplorerFileType::SelectByExtension(extension);
+ item.type = _FileType::SelectByExtension(extension);
}
if(attribs.isDrive &&
return item;
}
+#endif
+*/
-public class ExplorerFileBranch : struct
+public class FileSystemNode : struct
{
- ExplorerFileBranch prev, next;
+public:
+ /*//LinkElement<FileSystemNode> link;
+ FileSystemNode parent;
+
+ FileSystemNodeType type;
+
+ char * name;*/
+
+ FileSystemNode prev, next;
bool loaded, childrenLoaded;
int indent;
+ char * path;
char * name;
+ char * label;
+ char * extension;
char * info;
DataRow row;
OldList children;
- ExplorerFileType type;
- ExplorerFileBranch parent;
+ _FileType type;
+ FileSystemNode parent;
FileStats stats;
+ Bitmap bitmap;
+
void GetPath(String outputPath)
{
- ExplorerFileBranch up;
+ FileSystemNode up;
if(parent)
{
- strcpy(outputPath, name);
+ if(name)
+ strcpy(outputPath, name);
for(up = parent; up; up = up.parent)
{
char temp[MAX_LOCATION];
}
}
else
-#ifdef __WIN32__
+/*#ifdef __WIN32__
strcpy(outputPath, "/");
-#else
+#else*/
strcpy(outputPath, name);
-#endif
+//#endif
}
- bool IsChildOf(ExplorerFileBranch branch)
+ bool IsChildOf(FileSystemNode node)
{
- ExplorerFileBranch test;
+ FileSystemNode test;
for(test = parent; test; test = test.parent)
- if(test == branch)
+ if(test == node)
return true;
return false;
}
- void DuplicateChildren(bool recursive, bool forceExpanded, ExplorerFileBranch addTo, ListBox tree)
+ void DuplicateChildren(bool recursive, bool forceExpanded, FileSystemNode addTo, FileSystemBox fsb)
{
if(children.first)
{
- ExplorerFileBranch child;
+ FileSystemNode child;
for(child = children.first; child; child = child.next)
{
- ExplorerFileBranch copy { };
+ FileSystemNode copy { };
copy.name = CopyString(child.name);
copy.type = child.type;
- AddBranch(copy, child.loaded, false, addTo, tree);
+ fsb.AddTreeNode(copy, child.loaded, false, addTo);
if(forceExpanded)
copy.row.collapsed = false;
if(recursive)
- child.DuplicateChildren(recursive, forceExpanded, copy, tree);
+ child.DuplicateChildren(recursive, forceExpanded, copy, fsb);
}
}
}
void Free()
{
- ExplorerFileBranch child;
+ FileSystemNode child;
for(; (child = children.first); )
{
child.Free();
}
//if(name)
delete name;
+ delete label;
delete info;
}
parent.children.Delete(this);
}
- void OnDisplay(Surface surface, int x, int y, int width, ExplorerControl control, Alignment alignment, DataDisplayFlags displayFlags)
+ void OnDisplay(Surface surface, int x, int y, int width, FileSystemBox fsb, Alignment alignment, DataDisplayFlags displayFlags)
{
//int indentSize = (displayFlags.dropBox) ? 0 : 10;
int indent = 16;
int len;
int w, h;
//int textOffset;
- char label[MAX_FILENAME];
+ char string[MAX_FILENAME];
Bitmap icon;
if(!this)
return;
- icon = control.fileIcons[type].bitmap;
+ icon = fsb.fileIcons[type].bitmap;
//xStart = indent * indent + x + (icon ? (icon.width + 5) : 0);
xStart = x + (icon ? (icon.width + 5) : 0);
return;
if(info)
- sprintf(label, "%s [%s]", name, info);
+ sprintf(string, "%s [%s]", label ? label : name, info);
else
- strcpy(label, name);
- len = strlen(label);
+ strcpy(string, label ? label : name);
+ len = strlen(string);
if(!icon)
{
//textOffset = indent * indentSize + (icon ? (icon.width + 4) : 0);
surface.TextOpacity(false);
- surface.TextExtent(label, len, &w, &h);
+ surface.TextExtent(string, len, &w, &h);
h = Max(h, 16);
// Draw the current row stipple
surface.Area(xStart - 3, y, xStart + w + 1, y + h - 1);
//surface.WriteTextDots(alignment, x + textOffset, y + 2, width - textOffset, name, strlen(name));
- surface.WriteTextDots(alignment, xStart, y + 2, width, label, len);
+ surface.WriteTextDots(alignment, xStart, y + 2, width, string, len);
if(!guiApp.textMode)
{
if(icon)
{
+ w = icon.width;
+ h = icon.height;
+ }
+ if(type == pictureFile && fsb.previewPictures && bitmap)
+ {
+ surface.SetForeground(white);
+ surface.blend = true;
+ //#ifndef __linux__
+ //surface.Filter(bitmap, (clientSize.w - w) / 2,(clientSize.h - h) / 2, 0,0, w, h, bitmap.width, bitmap.height);
+ //surface.Filter(bitmap, x + indent/* * indentSize*/ + 2, y, 0, 0, w, h, bitmap.width, bitmap.height);
+ surface.Filter(bitmap, x,y,0,0, w, h, bitmap.width, bitmap.height);
+ //#else
+ // Until Filter / Stretch works with X
+ //surface.Blit(bitmap, (clientSize.w - bitmap.width) / 2,(clientSize.h - bitmap.height) / 2, 0,0, bitmap.width, bitmap.height);
+ // surface.blend = true;
+ //surface.Blit(bitmap, x + indent/* * indentSize*/ + 2, y,0,0, w, h);
+ //surface.Blit(bitmap, x,y,0,0, bitmap.width, bitmap.height);
+ //#endif
+ //bitmap.Free();
+ //delete bitmap;
+ }
+ else if(icon)
+ {
//surface.blend = true;
//surface.alphaWrite = blend;
surface.SetForeground(white);
}
}
- int OnCompare(ExplorerFileBranch b)
+ int OnCompare(FileSystemNode b)
{
int result;
- if(type == b.type || (type < folder && b.type < folder) || (type >= drive))
- result = strcmpi(name, b.name);
+ FileSystemNode a = this;
+ if(a.type == b.type || (a.type < folder && b.type < folder) || (a.type >= drive))
+ result = strcmpi(a.name, b.name);
else
{
- if(type == folder && b.type < folder) result = -1;
- else if(type < folder && b.type == folder) result = 1;
+ if(a.type == folder && b.type < folder) result = -1;
+ else if(a.type < folder && b.type == folder) result = 1;
+ else result = 0;
}
return result;
}
+ /*int OnCompare(FileSystemNode b)
+ {
+ int result;
+ FileSystemNode a = this;
+ if(a.parent < b.parent) result = -1;
+ else if(a.parent > b.parent) result = 1;
+ else
+ result = fstrcmp(a.name, b.name);
+ return result;
+ }*/
+
char * OnGetString(char * tempString, FileSystemToolWindow fileSysToolWnd, bool * needClass)
{
return name ? name : "";
}
-};
+}
-ExplorerFileBranch MakeFileBranch(const FileStats stats, const char * name)
+/*FileSystemNode MakeFileSystemNode(const FileStats stats, const char * name)
{
- ExplorerFileBranch fileTreeBranch { stats = stats };
- fileTreeBranch.name = CopyString(name);
- if(!fileTreeBranch.name)
- fileTreeBranch.name = null;
+ FileSystemNode node { stats = stats };
+ node.name = CopyString(name);
+ if(!node.name)
+ node.name = null;
if(stats.attribs.isDirectory)
{
- fileTreeBranch.type = (stats.attribs.isDrive) ? drive : folder;
- if(stats.attribs.isServer) fileTreeBranch.type = server;
- if(stats.attribs.isShare) fileTreeBranch.type = share;
- if(stats.attribs.isCDROM) fileTreeBranch.type = cdrom;
- if(stats.attribs.isRemote) fileTreeBranch.type = netDrive;
+ node.type = (stats.attribs.isDrive) ? drive : folder;
+ if(stats.attribs.isServer) node.type = server;
+ if(stats.attribs.isShare) node.type = share;
+ if(stats.attribs.isCDROM) node.type = cdrom;
+ if(stats.attribs.isRemote) node.type = netDrive;
if(stats.attribs.isRemovable)
{
if(name[0] == 'A' || name[0] == 'B')
- fileTreeBranch.type = floppy;
+ node.type = floppy;
else
- fileTreeBranch.type = removable;
+ node.type = removable;
}
}
else
{
char extension[MAX_EXTENSION];
- GetExtension(fileTreeBranch.name, extension);
- fileTreeBranch.type = ExplorerFileType::SelectByExtension(extension);
+ GetExtension(node.name, extension);
+ node.type = _FileType::SelectByExtension(extension);
}
- return fileTreeBranch;
-}
-
-void AddBranch(ExplorerFileBranch branch, bool loaded, bool addLoader, ExplorerFileBranch addTo, ListBox tree)
+ return node;
+}*/
+static FileSystemNode MakeFileSystemNode(const FileStats stats,
+ const char * fileName, const char * filePath,
+ const bool previewPicture, const DisplaySystem displaySystem)
{
- DataRow row = (addTo && addTo.row) ? addTo.row.AddRow() : tree.AddRow();
- if(addTo)
- {
- branch.parent = addTo;
- branch.indent = addTo.indent + 1;
- addTo.children.Add(branch);
- }
- row.tag = (int)branch;
- branch.row = row;
- row.SetData(null, branch);
-
- branch.loaded = loaded;
- if(addLoader)
- //AddBranch(ExplorerFileBranch { }, false, false, branch, tree); // why would this create a compile error?
- AddBranch(ExplorerFileBranch { type = none }, false, false, branch, tree);
-
- if(branch.indent > 0)
- row.collapsed = true;
- else if(branch.type == folder)
- branch.type = folderOpen;
-}
+ int len = strlen(fileName);
+ char info[MAX_LOCATION];
+ char name[MAX_LOCATION];
+ char extension[MAX_EXTENSION];
+
+ FileSystemNode node { stats = stats };
-void BranchLoad(ExplorerFileBranch branch, ListBox tree)
-{
- if(!branch.loaded)
+ //if(stats.attribs.isFile) // TODO fix this in ecere
+ if(stats.attribs.isDirectory)
{
- char path[MAX_LOCATION];
- branch.GetPath(path);
- {
- FileListing listing { path };
- if(branch.children.count == 1)
- DeleteBranch(branch.children.first, tree);
+ extension[0] = '\0';
- while(listing.Find())
- {
- if(listing.stats.attribs.isDirectory)
- {
- ExplorerFileBranch child = MakeFileBranch(listing.stats, listing.name);
- AddBranch(child, true, false, branch, tree);
- BranchChildLoad(child, branch, tree);
- }
- }
+ node.type = (stats.attribs.isDrive) ? drive : folder;
+ if(stats.attribs.isServer) node.type = server;
+ if(stats.attribs.isShare) node.type = share;
+ if(stats.attribs.isCDROM) node.type = cdrom;
+ if(stats.attribs.isRemote) node.type = netDrive;
+ if(stats.attribs.isRemovable)
+ {
+ if(fileName[0] == 'A' || fileName[0] == 'B')
+ node.type = floppy;
+ else
+ node.type = removable;
}
- branch.childrenLoaded = true;
- branch.loaded = true;
- branch.row.SortSubRows(false);
}
- else if(!branch.childrenLoaded)
+ else
{
- ExplorerFileBranch child;
- if(branch.children.first)
- {
- for(child = branch.children.first; child; child = child.next)
- {
- if(!child.loaded)
- BranchLoad(child, tree);
- else if(!child.childrenLoaded)
- BranchChildLoad(child, branch, tree);
- }
- branch.childrenLoaded = true;
- branch.row.SortSubRows(false);
- }
+ GetExtension(fileName, extension);
+ strlwr(extension);
+
+ node.type = _FileType::SelectByExtension(extension);
}
-}
-static void BranchChildLoad(ExplorerFileBranch parent, ExplorerFileBranch branch, ListBox tree)
-{
- char path[MAX_LOCATION];
- parent.GetPath(path);
+ if(stats.attribs.isDrive &&
+ len > 3 && !strncmp(&fileName[1], ": [", 3))
{
- bool added = false;
- FileListing listing { path };
- while(listing.Find())
- {
- if(listing.stats.attribs.isDirectory)
- {
- ExplorerFileBranch child = MakeFileBranch(listing.stats, listing.name);
- AddBranch(child, true, false, parent, tree);
- added = true;
- }
- }
- if(!added)
- added = true;
+ strncpy(name, fileName, 2);
+ name[2] = 0;
+ strncpy(info, &fileName[4], len - 5);
+ info[len - 5] = 0;
+ }
+ else
+ {
+ strcpy(name, fileName);
+ info[0] = 0;
}
- //parent.childrenLoaded = true;
-}
-void DeleteBranch(ExplorerFileBranch branch, ListBox tree)
-{
- ExplorerFileBranch child;
- for(; (child = branch.children.first); )
- DeleteBranch(child, tree);
- tree.DeleteRow(branch.row);
- branch.Delete();
-}
+ node.path = CopyString(filePath);
+ node.name = CopyString(name);
+ if(info[0])
+ node.info = CopyString(info);
+ node.extension = CopyString(extension);
+ if(node.type == pictureFile && previewPicture)
+ {
+ node.bitmap = Bitmap { alphaBlend = true };
+ node.bitmap.Load(filePath, null, displaySystem);
+ }
+
+ return node;
+}