mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-17 07:44:09 +02:00
256 lines
7.2 KiB
Beef
256 lines
7.2 KiB
Beef
using Beefy.theme.dark;
|
|
using System;
|
|
using Beefy.widgets;
|
|
using Beefy.theme;
|
|
using System.IO;
|
|
using Beefy.utils;
|
|
using Beefy.gfx;
|
|
|
|
namespace IDE.ui
|
|
{
|
|
class ModulePanel : Panel
|
|
{
|
|
public IDEListView mListView;
|
|
bool mModulesDirty = true;
|
|
|
|
public this()
|
|
{
|
|
mListView = new IDEListView();
|
|
mListView.InitScrollbars(true, true);
|
|
mListView.mHorzScrollbar.mPageSize = GS!(100);
|
|
mListView.mHorzScrollbar.mContentSize = GS!(500);
|
|
mListView.mVertScrollbar.mPageSize = GS!(100);
|
|
mListView.mVertScrollbar.mContentSize = GS!(500);
|
|
mListView.mAutoFocus = true;
|
|
mListView.mOnLostFocus.Add(new (evt) =>
|
|
{
|
|
if (!mShowingRightClickMenu)
|
|
mListView.GetRoot().SelectItemExclusively(null);
|
|
});
|
|
mListView.UpdateScrollbars();
|
|
|
|
AddWidget(mListView);
|
|
|
|
ListViewColumn column = mListView.AddColumn(GS!(100), "Name");
|
|
column.mMinWidth = GS!(130);
|
|
column = mListView.AddColumn(GS!(200), "Path");
|
|
column = mListView.AddColumn(GS!(200), "Debug Info File");
|
|
column = mListView.AddColumn(GS!(120), "Version");
|
|
column = mListView.AddColumn(GS!(200), "Address");
|
|
column = mListView.AddColumn(GS!(100), "Size");
|
|
column = mListView.AddColumn(GS!(120), "Timestamp");
|
|
mListView.mOnItemMouseDown.Add(new => ListViewItemMouseDown);
|
|
mListView.mOnItemMouseClicked.Add(new => ListViewItemMouseClicked);
|
|
mListView.mOnKeyDown.Add(new => ListViewKeyDown_ShowMenu);
|
|
}
|
|
|
|
public override void Serialize(StructuredData data)
|
|
{
|
|
base.Serialize(data);
|
|
data.Add("Type", "ModulePanel");
|
|
}
|
|
|
|
public override void FocusForKeyboard()
|
|
{
|
|
// Update to allow for populating of list if necessary
|
|
Update();
|
|
mListView.SetFocus();
|
|
if ((mListView.GetRoot().FindFocusedItem() == null) && (mListView.GetRoot().GetChildCount() > 0))
|
|
{
|
|
mListView.GetRoot().SelectItemExclusively(mListView.GetRoot().GetChildAtIndex(0));
|
|
}
|
|
}
|
|
|
|
public void ModulesChanged()
|
|
{
|
|
mModulesDirty = true;
|
|
}
|
|
|
|
public void GetFileNameFrom(ListViewItem item, String filePath)
|
|
{
|
|
var pathItem = item.GetSubItem(1);
|
|
StringView label = pathItem.Label;
|
|
int parenPos = label.IndexOf('(');
|
|
if (parenPos != -1)
|
|
label.RemoveToEnd(parenPos);
|
|
label.Trim();
|
|
filePath.Append(label);
|
|
}
|
|
|
|
protected override void ShowRightClickMenu(Widget relWidget, float x, float y)
|
|
{
|
|
base.ShowRightClickMenu(relWidget, x, y);
|
|
|
|
#if !CLI
|
|
var root = relWidget as ListViewItem;
|
|
var listView = root.mListView;
|
|
if (listView.GetRoot().FindFirstSelectedItem() != null)
|
|
{
|
|
Menu menu = new Menu();
|
|
Menu anItem;
|
|
anItem = menu.AddItem("Load Image...");
|
|
anItem.mOnMenuItemSelected.Add(new (item) =>
|
|
{
|
|
listView.GetRoot().WithSelectedItems(scope (item) =>
|
|
{
|
|
String filePath = scope .();
|
|
GetFileNameFrom(item, filePath);
|
|
|
|
String dir = scope String();
|
|
Path.GetDirectoryPath(filePath, dir);
|
|
IDEUtils.FixFilePath(dir);
|
|
|
|
String fileName = scope String();
|
|
Path.GetFileName(filePath, fileName);
|
|
|
|
String extName = scope String();
|
|
Path.GetExtension(filePath, extName);
|
|
extName.ToLower();
|
|
|
|
var fileDialog = scope System.IO.OpenFileDialog();
|
|
fileDialog.ShowReadOnly = false;
|
|
fileDialog.Title = "Select Image File";
|
|
fileDialog.Multiselect = false;
|
|
if (!dir.IsEmpty)
|
|
fileDialog.InitialDirectory = dir;
|
|
fileDialog.ValidateNames = true;
|
|
fileDialog.DefaultExt = ".exe";
|
|
fileDialog.FileName = fileName;
|
|
fileDialog.SetFilter(scope String()..AppendF("{0}|{0}|File (*{1})|*{1}|All files (*.*)|*.*", fileName, extName));
|
|
mWidgetWindow.PreModalChild();
|
|
if (fileDialog.ShowDialog(gApp.GetActiveWindow()).GetValueOrDefault() == .OK)
|
|
{
|
|
var fileNames = fileDialog.FileNames;
|
|
gApp.mDebugger.LoadImageForModule(filePath, fileNames[0]);
|
|
}
|
|
});
|
|
});
|
|
|
|
anItem = menu.AddItem("Load Debug Info...");
|
|
anItem.mOnMenuItemSelected.Add(new (item) =>
|
|
{
|
|
listView.GetRoot().WithSelectedItems(scope (item) =>
|
|
{
|
|
String filePath = scope .();
|
|
GetFileNameFrom(item, filePath);
|
|
|
|
String dir = scope String();
|
|
Path.GetDirectoryPath(filePath, dir);
|
|
IDEUtils.FixFilePath(dir);
|
|
|
|
var fileDialog = scope System.IO.OpenFileDialog();
|
|
fileDialog.ShowReadOnly = false;
|
|
fileDialog.Title = "Select Debug Info File";
|
|
fileDialog.Multiselect = false;
|
|
if (!dir.IsEmpty)
|
|
fileDialog.InitialDirectory = dir;
|
|
fileDialog.ValidateNames = true;
|
|
fileDialog.DefaultExt = ".exe";
|
|
fileDialog.SetFilter("PDB Debug Info (*.pdb)|*.pdb|All files (*.*)|*.*");
|
|
mWidgetWindow.PreModalChild();
|
|
if (fileDialog.ShowDialog(gApp.GetActiveWindow()).GetValueOrDefault() == .OK)
|
|
{
|
|
var fileNames = fileDialog.FileNames;
|
|
if (gApp.mDebugger.mIsRunning)
|
|
{
|
|
gApp.mDebugger.LoadDebugInfoForModule(filePath, fileNames[0]);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
anItem = menu.AddItem("Copy Info to Clipboard");
|
|
anItem.mOnMenuItemSelected.Add(new (item) =>
|
|
{
|
|
String moduleInfo = scope .();
|
|
listView.GetRoot().WithSelectedItems(scope (item) =>
|
|
{
|
|
if (!moduleInfo.IsEmpty)
|
|
moduleInfo.Append("\n");
|
|
gApp.mDebugger.GetModuleInfo(item.GetSubItem(1).Label, moduleInfo);
|
|
});
|
|
gApp.SetClipboardText(moduleInfo);
|
|
});
|
|
|
|
MenuWidget menuWidget = ThemeFactory.mDefault.CreateMenuWidget(menu);
|
|
menuWidget.Init(relWidget, x, y);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void UpdateModules()
|
|
{
|
|
int idx = 0;
|
|
if (gApp.mDebugger.mIsRunning)
|
|
{
|
|
var modulesInfoStr = scope String();
|
|
gApp.mDebugger.GetModulesInfo(modulesInfoStr);
|
|
|
|
for (let moduleInfoStr in modulesInfoStr.Split('\n'))
|
|
{
|
|
if (moduleInfoStr.IsEmpty)
|
|
continue;
|
|
|
|
ListViewItem lvItem;
|
|
|
|
if (idx < mListView.GetRoot().GetChildCount())
|
|
{
|
|
lvItem = mListView.GetRoot().GetChildAtIndex(idx);
|
|
int subIdx = 0;
|
|
for (let moduleStr in moduleInfoStr.Split('\t'))
|
|
{
|
|
let subLVItem = (DarkListViewItem)((subIdx == 0) ? lvItem : lvItem.GetSubItem(subIdx));
|
|
subLVItem.Label = moduleStr;
|
|
subIdx++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lvItem = mListView.GetRoot().CreateChildItem();
|
|
int subIdx = 0;
|
|
for (let moduleStr in moduleInfoStr.Split('\t'))
|
|
{
|
|
let subLVItem = (subIdx == 0) ? lvItem : lvItem.CreateSubItem(subIdx);
|
|
subLVItem.Label = moduleStr;
|
|
subIdx++;
|
|
}
|
|
}
|
|
|
|
DarkListViewItem subLVItem = (DarkListViewItem)lvItem.GetSubItem(1);
|
|
if (subLVItem.mLabel.StartsWith("!"))
|
|
{
|
|
subLVItem.mTextColor = 0xFFFF8080;
|
|
subLVItem.mLabel.Remove(0, 1);
|
|
}
|
|
else
|
|
{
|
|
subLVItem.mTextColor = 0xFFFFFFFF;
|
|
}
|
|
|
|
++idx;
|
|
}
|
|
}
|
|
|
|
while (idx < mListView.GetRoot().GetChildCount())
|
|
mListView.GetRoot().RemoveChildItemAt(idx);
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
base.Update();
|
|
|
|
if (mModulesDirty)
|
|
{
|
|
UpdateModules();
|
|
mModulesDirty = false;
|
|
}
|
|
}
|
|
|
|
public override void Resize(float x, float y, float width, float height)
|
|
{
|
|
base.Resize(x, y, width, height);
|
|
mListView.Resize(0, 0, width, height);
|
|
mListView.ScrollPositionChanged();
|
|
}
|
|
}
|
|
}
|