dlangui/examples/spreadsheet/src/spreadsheetapp.d

260 lines
11 KiB
D

module spreadsheet;
import dlangui;
import dlangui.dialogs.filedlg;
import dlangui.dialogs.dialog;
import dlangui.widgets.spreadsheet;
import std.array : replaceFirst;
mixin APP_ENTRY_POINT;
// action codes
enum IDEActions : int {
//ProjectOpen = 1010000,
FileNew = 1010000,
FileOpen,
FileSave,
FileSaveAs,
FileSaveAll,
FileClose,
FileExit,
EditPreferences,
DebugStart,
HelpAbout,
}
// actions
const Action ACTION_FILE_NEW = new Action(IDEActions.FileNew, "MENU_FILE_NEW"c, "document-new", KeyCode.KEY_N, KeyFlag.Control);
const Action ACTION_FILE_SAVE = (new Action(IDEActions.FileSave, "MENU_FILE_SAVE"c, "document-save", KeyCode.KEY_S, KeyFlag.Control)).disableByDefault();
const Action ACTION_FILE_SAVE_AS = (new Action(IDEActions.FileSaveAs, "MENU_FILE_SAVE_AS"c)).disableByDefault();
const Action ACTION_FILE_OPEN = new Action(IDEActions.FileOpen, "MENU_FILE_OPEN"c, "document-open", KeyCode.KEY_O, KeyFlag.Control);
const Action ACTION_FILE_EXIT = new Action(IDEActions.FileExit, "MENU_FILE_EXIT"c, "document-close"c, KeyCode.KEY_X, KeyFlag.Alt);
const Action ACTION_EDIT_COPY = (new Action(EditorActions.Copy, "MENU_EDIT_COPY"c, "edit-copy"c, KeyCode.KEY_C, KeyFlag.Control)).addAccelerator(KeyCode.INS, KeyFlag.Control).disableByDefault();
const Action ACTION_EDIT_PASTE = (new Action(EditorActions.Paste, "MENU_EDIT_PASTE"c, "edit-paste"c, KeyCode.KEY_V, KeyFlag.Control)).addAccelerator(KeyCode.INS, KeyFlag.Shift).disableByDefault();
const Action ACTION_EDIT_CUT = (new Action(EditorActions.Cut, "MENU_EDIT_CUT"c, "edit-cut"c, KeyCode.KEY_X, KeyFlag.Control)).addAccelerator(KeyCode.DEL, KeyFlag.Shift).disableByDefault();
const Action ACTION_EDIT_UNDO = (new Action(EditorActions.Undo, "MENU_EDIT_UNDO"c, "edit-undo"c, KeyCode.KEY_Z, KeyFlag.Control)).disableByDefault();
const Action ACTION_EDIT_REDO = (new Action(EditorActions.Redo, "MENU_EDIT_REDO"c, "edit-redo"c, KeyCode.KEY_Y, KeyFlag.Control)).addAccelerator(KeyCode.KEY_Z, KeyFlag.Control|KeyFlag.Shift).disableByDefault();
const Action ACTION_EDIT_INDENT = (new Action(EditorActions.Indent, "MENU_EDIT_INDENT"c, "edit-indent"c, KeyCode.TAB, 0)).addAccelerator(KeyCode.KEY_BRACKETCLOSE, KeyFlag.Control).disableByDefault();
const Action ACTION_EDIT_UNINDENT = (new Action(EditorActions.Unindent, "MENU_EDIT_UNINDENT"c, "edit-unindent", KeyCode.TAB, KeyFlag.Shift)).addAccelerator(KeyCode.KEY_BRACKETOPEN, KeyFlag.Control).disableByDefault();
const Action ACTION_EDIT_TOGGLE_LINE_COMMENT = (new Action(EditorActions.ToggleLineComment, "MENU_EDIT_TOGGLE_LINE_COMMENT"c, null, KeyCode.KEY_DIVIDE, KeyFlag.Control)).disableByDefault();
const Action ACTION_EDIT_TOGGLE_BLOCK_COMMENT = (new Action(EditorActions.ToggleBlockComment, "MENU_EDIT_TOGGLE_BLOCK_COMMENT"c, null, KeyCode.KEY_DIVIDE, KeyFlag.Control|KeyFlag.Shift)).disableByDefault();
const Action ACTION_EDIT_PREFERENCES = (new Action(IDEActions.EditPreferences, "MENU_EDIT_PREFERENCES"c, null)).disableByDefault();
const Action ACTION_DEBUG_START = new Action(IDEActions.DebugStart, "MENU_DEBUG_UPDATE_PREVIEW"c, "debug-run"c, KeyCode.F5, 0);
const Action ACTION_HELP_ABOUT = new Action(IDEActions.HelpAbout, "MENU_HELP_ABOUT"c);
class EditFrame : AppFrame {
MenuItem mainMenuItems;
override protected void initialize() {
_appName = "DlangUISpreadSheet";
super.initialize();
}
/// create main menu
override protected MainMenu createMainMenu() {
mainMenuItems = new MenuItem();
MenuItem fileItem = new MenuItem(new Action(1, "MENU_FILE"));
fileItem.add(ACTION_FILE_NEW, ACTION_FILE_OPEN,
ACTION_FILE_EXIT);
mainMenuItems.add(fileItem);
MenuItem editItem = new MenuItem(new Action(2, "MENU_EDIT"));
editItem.add(ACTION_EDIT_COPY, ACTION_EDIT_PASTE,
ACTION_EDIT_CUT, ACTION_EDIT_UNDO, ACTION_EDIT_REDO,
ACTION_EDIT_INDENT, ACTION_EDIT_UNINDENT, ACTION_EDIT_TOGGLE_LINE_COMMENT, ACTION_EDIT_TOGGLE_BLOCK_COMMENT, ACTION_DEBUG_START);
editItem.add(ACTION_EDIT_PREFERENCES);
mainMenuItems.add(editItem);
MainMenu mainMenu = new MainMenu(mainMenuItems);
return mainMenu;
}
/// create app toolbars
override protected ToolBarHost createToolbars() {
ToolBarHost res = new ToolBarHost();
ToolBar tb;
tb = res.getOrAddToolbar("Standard");
tb.addButtons(ACTION_FILE_NEW, ACTION_FILE_OPEN, ACTION_FILE_SAVE, ACTION_SEPARATOR, ACTION_DEBUG_START);
tb = res.getOrAddToolbar("Edit");
tb.addButtons(ACTION_EDIT_COPY, ACTION_EDIT_PASTE, ACTION_EDIT_CUT, ACTION_SEPARATOR,
ACTION_EDIT_UNDO, ACTION_EDIT_REDO, ACTION_EDIT_INDENT, ACTION_EDIT_UNINDENT);
return res;
}
string _filename;
void openSourceFile(string filename) {
import std.file;
// TODO
if (exists(filename)) {
_filename = filename;
window.windowCaption = toUTF32(filename);
//_editor.load(filename);
//updatePreview();
}
}
void saveSourceFile(string filename) {
if (filename.length == 0)
filename = _filename;
//import std.file;
//_filename = filename;
//window.windowCaption = toUTF32(filename);
//_editor.save(filename);
}
bool onCanClose() {
// todo
return true;
}
FileDialog createFileDialog(UIString caption, bool fileMustExist = true) {
uint flags = DialogFlag.Modal | DialogFlag.Resizable;
if (fileMustExist)
flags |= FileDialogFlag.FileMustExist;
FileDialog dlg = new FileDialog(caption, window, null, flags);
dlg.filetypeIcons[".d"] = "text-dml";
return dlg;
}
void saveAs() {
}
/// override to handle specific actions
override bool handleAction(const Action a) {
if (a) {
switch (a.id) {
case IDEActions.FileExit:
if (onCanClose())
window.close();
return true;
case IDEActions.HelpAbout:
window.showMessageBox(UIString("About DlangUI ML Editor"d),
UIString("DLangIDE\n(C) Vadim Lopatin, 2015\nhttp://github.com/buggins/dlangui\nSimple editor for DML code"d));
return true;
case IDEActions.FileNew:
UIString caption;
caption = "Create new DML file"d;
FileDialog dlg = createFileDialog(caption, false);
dlg.addFilter(FileFilterEntry(UIString("DML files"d), "*.dml"));
dlg.addFilter(FileFilterEntry(UIString("All files"d), "*.*"));
dlg.dialogResult = delegate(Dialog dlg, const Action result) {
if (result.id == ACTION_OPEN.id) {
string filename = result.stringParam;
//_editor.text=""d;
saveSourceFile(filename);
}
};
dlg.show();
return true;
case IDEActions.FileSave:
if (_filename.length) {
saveSourceFile(_filename);
return true;
}
UIString caption;
caption = "Save DML File as"d;
FileDialog dlg = createFileDialog(caption, false);
dlg.addFilter(FileFilterEntry(UIString("DML files"d), "*.dml"));
dlg.addFilter(FileFilterEntry(UIString("All files"d), "*.*"));
dlg.dialogResult = delegate(Dialog dlg, const Action result) {
if (result.id == ACTION_OPEN.id) {
string filename = result.stringParam;
saveSourceFile(filename);
}
};
dlg.show();
return true;
case IDEActions.FileOpen:
UIString caption;
caption = "Open DML File"d;
FileDialog dlg = createFileDialog(caption);
dlg.addFilter(FileFilterEntry(UIString("DML files"d), "*.dml"));
dlg.addFilter(FileFilterEntry(UIString("All files"d), "*.*"));
dlg.dialogResult = delegate(Dialog dlg, const Action result) {
if (result.id == ACTION_OPEN.id) {
string filename = result.stringParam;
openSourceFile(filename);
}
};
dlg.show();
return true;
case IDEActions.DebugStart:
return true;
case IDEActions.EditPreferences:
//showPreferences();
return true;
default:
return super.handleAction(a);
}
}
return false;
}
/// override to handle specific actions state (e.g. change enabled state for supported actions)
override bool handleActionStateRequest(const Action a) {
switch (a.id) {
case IDEActions.HelpAbout:
case IDEActions.FileNew:
case IDEActions.FileSave:
case IDEActions.FileOpen:
case IDEActions.DebugStart:
case IDEActions.EditPreferences:
a.state = ACTION_STATE_ENABLED;
return true;
default:
return super.handleActionStateRequest(a);
}
}
SpreadSheetWidget _spreadsheet;
/// create app body widget
override protected Widget createBody() {
VerticalLayout bodyWidget = new VerticalLayout();
bodyWidget.layoutWidth = FILL_PARENT;
bodyWidget.layoutHeight = FILL_PARENT;
_spreadsheet = new SpreadSheetWidget();
bodyWidget.addChild(_spreadsheet);
return bodyWidget;
}
}
/// entry point for dlangui based application
extern (C) int UIAppMain(string[] args) {
// embed non-standard resources listed in views/resources.list into executable
embeddedResourceList.addResources(embedResourcesFromList!("resources.list")());
/// set font gamma (1.0 is neutral, < 1.0 makes glyphs lighter, >1.0 makes glyphs bolder)
FontManager.fontGamma = 0.8;
FontManager.hintingMode = HintingMode.Normal;
// select translation file - for english language
Platform.instance.uiLanguage = "en";
// load theme from file "theme_custom.xml"
Platform.instance.uiTheme = "theme_custom";
// create window
Window window = Platform.instance.createWindow("DlangUI SpreadSheet example"d, null, WindowFlag.Resizable, 700, 470);
// create some widget to show in window
window.windowIcon = drawableCache.getImage("dlangui-logo1");
FontRef font = FontManager.instance.getFont(24, 300, false, FontFamily.SansSerif, "Arial");
Log.d("font found: ", font.face);
font = FontManager.instance.getFont(24, 300, false, FontFamily.Serif, "Times New Roman");
Log.d("font found: ", font.face);
// create some widget to show in window
window.mainWidget = new EditFrame();
// show window
window.show();
// run message loop
return Platform.instance.enterMessageLoop();
}