ultimatepp/uppsrc/ide/Custom.cpp
cxl 44037d6a0c 'Event' branch merged into trunk (Callback now deprecated)
git-svn-id: svn://ultimatepp.org/upp/trunk@10260 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2016-10-04 08:15:05 +00:00

150 lines
4.7 KiB
C++

#include "ide.h"
struct Custom : public WithCustomLayout<TopWindow> {
LineEdit output;
LineEdit command;
DropList package;
EditString when;
EditString extension;
void InsertCmd(String s);
void InsertOut(String s);
void DoMenu(Button& b, Callback1<String> cb, bool cmd);
void OutMenu();
void CmdMenu();
void Perform(const char *main);
Custom();
typedef Custom CLASSNAME;
};
void Custom::InsertCmd(String s) {
command.Paste(s.ToWString());
command.SetFocus();
}
void Custom::InsertOut(String s) {
output.Paste(s.ToWString());
output.SetFocus();
}
void Custom::DoMenu(Button& b, Callback1<String> cb, bool cmd) {
if(!list.IsCursor()) return;
MenuBar menu;
// Event<> Arg<String> set;
// set <<= cb;
String pk = list.Get(0);
String ext = (String)list.Get(2);
if(ext[0] != '.')
ext = '.' + ext;
String samplefile = "foo/" + ForceExt("sample", ext);
String sample = SourcePath(pk, samplefile);
menu.Add("Input file path (like '" + UnixPath(sample) + "')", callback1(cb, "$(PATH)"));
menu.Add("Input file package-relative path (like '" + samplefile + "')", callback1(cb, "$(RELPATH)"));
menu.Add("Input file directory (like '" + samplefile + "')", callback1(cb, "$(FILEDIR)"));
menu.Add("Package directory (like '" + UnixPath(GetFileFolder(sample)) + "')", callback1(cb, "$(DIR)"));
menu.Add("Input file name (like '" + GetFileName(sample) + "')", callback1(cb, "$(FILE)"));
menu.Add("Input file title (like '" + GetFileTitle(sample) + "')", callback1(cb, "$(TITLE)"));
menu.Add("Input file package (like '" + pk + "')", callback1(cb, "$(PACKAGE)"));
Vector<String> ss = SplitFlags0((String)list.Get(1));
String opath = "f:/out/mypackage/WIN32-ST/somefile.ext";
menu.Add("Package output directory (like '" + opath + "')", callback1(cb, "$(OUTDIR)"));
opath = "f:/out/WIN32-ST/myapp.exe";
menu.Add("Executable path (like '" + UnixPath(opath) + "')", callback1(cb, "$(EXEPATH)"));
menu.Add("Executable directory (like '" + UnixPath(GetFileFolder(opath)) + "')", callback1(cb, "$(EXEDIR)"));
menu.Add("Executable filename (like '" + UnixPath(GetFileName(opath)) + "')", callback1(cb, "$(EXEFILE)"));
menu.Add("Executable title (like '" + UnixPath(GetFileTitle(opath)) + "')", callback1(cb, "$(EXETITLE)"));
menu.Add("Semicolon separated include dirs (like '/bin/include;/cpp/inc')", callback1(cb, "$(INCLUDE)"));
menu.Add("Prefixed include dirs (like '-inc/include -inc/cpp/inc' for '$(!-inc)')",
callback1(cb, "$(!)"));
menu.Add("$ character", callback1(cb, "$$"));
if(cmd) {
menu.Separator();
menu.Add("copy command", callback1(cb, "cp "));
menu.Add("chdir command", callback1(cb, "cd "));
}
menu.Execute(b.GetScreenRect().BottomLeft());
}
void Custom::OutMenu() {
DoMenu(outputmenu, THISBACK(InsertOut), false);
}
void Custom::CmdMenu() {
DoMenu(commandmenu, THISBACK(InsertCmd), true);
}
Custom::Custom() {
CtrlLayoutExit(*this, "Custom build steps");
Sizeable().MaximizeBox();
list.AutoHideSb();
list.Appending().Removing();
list.AddColumn("Host package", 85).Edit(package);
list.AddColumn("When", 416).Edit(when);
when.SetFilter(CondFilter);
list.AddColumn(".extension", 74).Edit(extension);
list.AddCtrl(command);
list.AddCtrl(output);
outputmenu.SetFrame(InsetFrame());
outputmenu.SetImage(CtrlImg::smalldown()).NoWantFocus();
outputmenu <<= THISBACK(OutMenu);
commandmenu.SetFrame(InsetFrame());
commandmenu.SetImage(CtrlImg::smalldown()).NoWantFocus();
commandmenu <<= THISBACK(CmdMenu);
}
class CustomOrder : public ArrayCtrl::Order {
public:
virtual bool operator()(const Vector<Value>& row1, const Vector<Value>& row2) const {
for(int i = 0; i < 3; i++)
if(String(row1[i]) != String(row2[i]))
return String(row1[i]) < String(row2[i]);
return false;
}
};
void Custom::Perform(const char *main) {
Workspace wspc;
wspc.Scan(main);
list.Clear();
int i;
for(i = 0; i < wspc.GetCount(); i++) {
package.Add(wspc[i]);
if(i == 0)
list.IndexInfo(0).InsertValue(wspc[i]);
Array<CustomStep>& m = wspc.GetPackage(i).custom;
for(int j = 0; j < m.GetCount(); j++)
list.Add(wspc[i], m[j].when, m[j].ext, m[j].command, m[j].output);
}
list.Sort(Single<CustomOrder>());
list.SetCursor(0);
Run();
for(i = 0; i < wspc.GetCount(); i++)
wspc.GetPackage(i).custom.Clear();
for(i = 0; i < list.GetCount(); i++) {
String pk = list.Get(i, 0);
for(int k = 0; k < wspc.GetCount(); k++)
if(wspc[k] == pk) {
CustomStep& m = wspc.GetPackage(k).custom.Add();
m.when = list.Get(i, 1);
m.ext = list.Get(i, 2);
m.command = list.Get(i, 3);
m.output = list.Get(i, 4);
break;
}
}
for(i = 0; i < wspc.GetCount(); i++) {
String pp = PackagePath(wspc[i]);
RealizePath(pp);
wspc.GetPackage(i).Save(pp);
}
}
void Ide::CustomSteps() {
Custom dlg;
dlg.Perform(main);
ScanWorkspace();
}