examples/apps/csharp/texteditor/src/texteditor_main.cs

197 lines
7.5 KiB
C#

/* Simple text editor with a main text box and a toolbar on top:
+vbox----------------------------------------+
| +hbox------------------------------------+ |
| | +btn-+ +btn-+ +btn-+ +box-----+ +btn-+ | |
| | |NEW | |SAVE| |LOAD| | spacer | |QUIT| | |
| | +----+ +----+ +----+ +--------+ +----+ | |
| +----------------------------------------+ |
| +text------------------------------------+ |
| | | |
| | | |
| | Main text box | |
| | | |
| | | |
| +----------------------------------------+ |
+--------------------------------------------+
*/
using System;
public class TextEditor : Efl.Csharp.Application
{
private Efl.Ui.Win win; // The main window
private Efl.Ui.Text editorTextBox; // The main text entry
private Efl.Ui.Button toolbarButtonNew; // The "New" button in the toolbar
private Efl.Ui.Button toolbarButtonSave; // The "Save" button in the toolbar
private Efl.Ui.Button toolbarButtonLoad; // The "Load" button in the toolbar
private bool edited = false; // Document was edited since last save
// File to load and save is fixed since we do not use a file selection dialog
private readonly string filename = System.IO.Path.Combine(System.IO.Path.GetTempPath(),
"texteditor_example.txt");
// Quits the application
private void GUIQuitCb(object sender, Efl.Gfx.IEntityVisibilityChangedEvt_Args ea)
{
if (ea.arg == false)
Efl.App.AppMain.Quit(0);
}
// Enables or disables buttons on the toolbar as required
private void GUIToolbarRefresh()
{
// "New" is enabled if there is text in the text box
toolbarButtonNew.SetDisabled(string.IsNullOrEmpty(editorTextBox.GetText()));
// "Save" is enabled if the text has been modified since last save or load
toolbarButtonSave.SetDisabled(!edited);
// "Load" is enabled if there is a file to load
toolbarButtonLoad.SetDisabled(!System.IO.File.Exists(filename));
}
// Called when the text in the editor has changed
private void EditorChangedCb(object sender, EventArgs ea)
{
edited = true;
GUIToolbarRefresh();
}
// Shows a modal message popup with an "OK" button
private void ShowMessage(string message)
{
var popup = new Efl.Ui.TextAlertPopup (win);
popup.SetText(message);
popup.SetExpandable(new Eina.Size2D(200, 200));
popup.SetButton(Efl.Ui.AlertPopupButton.Positive, "OK", null);
popup.ButtonClickedEvt +=
(object sender, Efl.Ui.AlertPopupButtonClickedEvt_Args ea) => {
// Dismiss popup when the button is clicked
((Efl.Ui.TextAlertPopup)sender).SetParent(null);
};
}
// Adds a button to the toolbar, with the given text, icon and click event handler
private Efl.Ui.Button GUIToolbarButtonAdd(Efl.Ui.Box toolbar, string name,
string iconName, EventHandler<Efl.Ui.IClickableClickedEvt_Args> func)
{
var button = new Efl.Ui.Button(toolbar);
button.SetText(name);
button.ClickedEvt += func;
button.SetHintWeight(0, 1);
// Set the content of the button, which is an image
var image = new Efl.Ui.Image(toolbar);
image.SetIcon(iconName);
button.SetContent(image);
toolbar.Pack(button);
return button;
}
// Creates a new toolbar, with all its buttons
private void GUIToolbarSetup(Efl.Ui.Box parent)
{
// Create a horizontal box container for the buttons
var bar = new Efl.Ui.Box(parent);
// 0 vertical weight means that the toolbar will have the minimum height
// to accommodate all its buttons and not a pixel more. The rest of the
// space will be given to the other object in the parent container.
bar.SetHintWeight(1, 0);
bar.SetOrientation(Efl.Ui.LayoutOrientation.Horizontal);
parent.Pack(bar);
// "New" button
toolbarButtonNew = GUIToolbarButtonAdd(bar, "New", "document-new",
(object sender, Efl.Ui.IClickableClickedEvt_Args ea) => {
// When this button is clicked, remove content and refresh toolbar
editorTextBox.SetText("");
GUIToolbarRefresh();
});
// "Save" button
toolbarButtonSave = GUIToolbarButtonAdd(bar, "Save", "document-save",
(object sender, Efl.Ui.IClickableClickedEvt_Args ea) => {
// When this button is clicked, try to save content and refresh toolbar
try {
System.IO.File.WriteAllText(filename, editorTextBox.GetText());
edited = false;
GUIToolbarRefresh();
ShowMessage("Saved!");
} catch (Exception e) {
// If something fails, show the error message
ShowMessage(e.Message);
}
});
// "Load" button
toolbarButtonLoad = GUIToolbarButtonAdd(bar, "Load", "document-open",
(object sender, Efl.Ui.IClickableClickedEvt_Args ea) => {
// When this button is clicked, try to load content and refresh toolbar
try {
editorTextBox.SetText(System.IO.File.ReadAllText(filename));
edited = false;
GUIToolbarRefresh();
ShowMessage("Loaded!");
} catch (Exception e) {
// If something fails, show the error message
ShowMessage(e.Message);
}
});
// Spacer box to use all available space not required by buttons
// (It has a default horizontal weight of 1, whereas all buttons have
// a horizontal weight of 0).
// As a result, it pushes the "Quit" button to the right margin and
// the rest to the left.
Efl.Ui.Box box = new Efl.Ui.Box(parent);
bar.Pack(box);
// "Quit" button
GUIToolbarButtonAdd(bar, "Quit", "application-exit", (object sender, Efl.Ui.IClickableClickedEvt_Args e) => { Efl.Ui.Config.Exit(); } );
}
// Builds the user interface for the text editor
protected override void OnInitialize(string[] args)
{
// Create a window and initialize it
win = new Efl.Ui.Win(parent: Efl.App.AppMain);
win.SetText("Text Editor");
win.SetAutohide(true);
win.VisibilityChangedEvt += GUIQuitCb;
// Create a vertical box container
Efl.Ui.Box box = new Efl.Ui.Box(win);
win.SetContent(box);
// Create the toolbar and add it to the box
GUIToolbarSetup(box);
// Create the main text entry
editorTextBox = new Efl.Ui.Text(box);
editorTextBox.SetFont("Mono", 14);
editorTextBox.Multiline = true;
editorTextBox.Editable = true;
editorTextBox.Scrollable = true;
editorTextBox.SetHintSizeMin(new Eina.Size2D(360, 240));
editorTextBox.ChangedEvt += EditorChangedCb;
editorTextBox.ChangedUserEvt += EditorChangedCb;
box.Pack(editorTextBox);
// Initial refresh of the toolbar buttons
GUIToolbarRefresh();
}
}
public class Example
{
#if WIN32
[STAThreadAttribute()]
#endif
public static void Main()
{
TextEditor editor = new TextEditor();
editor.Launch();
}
}