application/main.c

Thu, 10 Apr 2014 11:37:41 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 10 Apr 2014 11:37:41 +0200
changeset 29
c96169444d88
parent 28
794a5c91c479
child 30
34513f76d5a8
permissions
-rw-r--r--

added locale support (Cocoa) and ucx update

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2012 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <stdio.h>
#include <stdlib.h>

#include <ui/ui.h>
#include <ucx/buffer.h>
#include <ucx/utils.h>

typedef struct TestDocument {
    UiInteger check1;
} TestDocument;

typedef struct TestWindowData {
    TestDocument *doc1;
    TestDocument *doc2;
    UiText       text;
} TestWindowData;

UiInteger check1;

UiList *list;

void action_new(UiEvent *event, void *data) {
    UiObject *window = ui_window("Mod1", NULL);
    //ui_window_addint(window, "check1");
    ui_show(window);
    if(event->eventdata)  {
        printf("%s\n", event->eventdata);
    }
}

void action_open(UiEvent *event, void *data) {
    //printf("check1: %s\n", event->intval ? "true" : "false");
    //printf("check1: %s\n", ui_getint(event->obj, "check1") ? "true" : "false");
    TestDocument *doc = event->document;
    TestWindowData *wd = event->window;
    printf("check1: %s\n", ui_getval(doc->check1) ? "true" : "false");
    
    char *path = ui_openfiledialog(event->obj);
    if(path) {
        UcxBuffer *buf = ucx_buffer_new(NULL, 4096, UCX_BUFFER_AUTOEXTEND);
        FILE *file = fopen(path, "r");
        if(file) {
            ucx_stream_hcopy(file, buf, fread, ucx_buffer_write);
            ucx_buffer_putc(buf, '\0');
            ui_setval(wd->text, buf->space);
            fclose(file);
        }
        ucx_buffer_free(buf);
    }
}

void action_save(UiEvent *event, void *data) {
    TestWindowData *wd = event->window;
    printf("Text: {%s}\n", ui_getval(wd->text));
    ui_setval(wd->text, uistr("hello"));
    
    ui_list_append(list, "abc");
    ui_notify(list->observers, NULL);
}

void action_close(UiEvent *event, void *data) {
    exit(0);
}

void action_doc1(UiEvent *event, void *data) {
    TestWindowData *wdata = event->window;
    if(event->obj->document != wdata->doc1) {
        ui_set_document(event->obj, wdata->doc1);
    }
    ui_unset_group(event->obj->ctx, 1);
}

void action_doc2(UiEvent *event, void *data) {
    TestWindowData *wdata = event->window;
    if(event->obj->document != wdata->doc2) {
        ui_set_document(event->obj, wdata->doc2);
    }
    ui_set_group(event->obj->ctx, 1);
}

void action_undo(UiEvent *event, void *data) {
    printf("undo\n");
    TestWindowData *wd = event->window;
    ui_text_undo(&wd->text);
}

void action_redo(UiEvent *event, void *data) {
    printf("redo\n");
    TestWindowData *wd = event->window;
    ui_text_redo(&wd->text);
}

void action_document(UiEvent *event, void *data) {
    UiList *documents = data;
    printf("selected document: %d\n", event->intval);
}

void action_cut(UiEvent *event, void *data) {
    printf("cut\n");
}

void action_copy(UiEvent *event, void *data) {
    printf("copy\n");
    TestWindowData *wd = event->window;
    int begin;
    int end;
    wd->text.selection(&wd->text, &begin, &end);
    char *selection = wd->text.getsubstr(&wd->text, begin, end);
    ui_clipboard_set(selection);
}

void action_paste(UiEvent *event, void *data) {
    printf("paste\n");
    TestWindowData *wd = event->window;
    char *str = ui_clipboard_get();
    if(str) {
        int pos = wd->text.position(&wd->text);
        wd->text.insert(&wd->text, pos, str);
        free(str);
    }
}

void action_delete(UiEvent *event, void *data) {
    printf("delete\n");
}


int main(int argc, char** argv) { 
    ui_init("app1", argc, argv);
    ui_load_locale(NULL);
    ui_openfilefunc(action_new, NULL);
    
    
    list = ui_list_new();
    ui_list_append(list, "file1.txt");
    ui_list_append(list, "hello.txt");
    ui_list_append(list, "main.c");
    
    ui_menu("File");
    ui_menuitem_st(UI_STOCK_NEW, action_new, NULL);
    ui_menuitem_st(UI_STOCK_OPEN, action_open, NULL);
    ui_menuitem_stgr(UI_STOCK_SAVE, action_save, NULL, 1, -1);
    ui_menuseparator();
    
    ui_menuitem("Dokument 1", action_doc1, NULL);
    ui_menuitem("Dokument 2", action_doc2, NULL);
    
    ui_menuseparator();
    
    ui_checkitem_nv("Check", "check1");
    //ui_checkitem("Check", action_open, NULL);
    
    void ui_menuseparator();
    ui_menuitem_list(list, action_document, list);
    ui_menuseparator();
    ui_menuitem_st(UI_STOCK_CLOSE, action_close, NULL);
    
    ui_menu("Edit");
    ui_menuitem_stgr(UI_STOCK_CUT, action_cut, NULL, UI_GROUP_SELECTION, -1);
    ui_menuitem_stgr(UI_STOCK_COPY, action_copy, NULL, UI_GROUP_SELECTION, -1);
    ui_menuitem_st(UI_STOCK_PASTE, action_paste, NULL);
    ui_menuitem_stgr(UI_STOCK_DELETE, action_delete, NULL, UI_GROUP_SELECTION, -1);
    
    
    ui_toolitem_st("new", UI_STOCK_NEW, action_new, NULL);
    ui_toolitem_st("open", UI_STOCK_GO_BACK, action_open, NULL);
    ui_toolitem_stgr("save", UI_STOCK_GO_FORWARD, action_save, NULL, 1, -1);
    ui_toolitem_st("close", UI_STOCK_CLOSE, action_close, NULL);
    ui_toolitem_st("undo", UI_STOCK_UNDO, action_undo, NULL);
    ui_toolitem_st("redo", UI_STOCK_REDO, action_redo, NULL);
    
    ui_toolbar_add_default("new");
    ui_toolbar_add_default("open");
    ui_toolbar_add_default("save");
    ui_toolbar_add_default("close");
    ui_toolbar_add_default("undo");
    ui_toolbar_add_default("redo");
    
    
    printf("create window\n");
    UiObject *window = ui_window("Mod0", NULL);
    TestWindowData *wdata = calloc(1, sizeof(TestWindowData));
    window->window = wdata;
    
    TestDocument *doc1 = ui_document_new(sizeof(TestDocument));
    TestDocument *doc2 = ui_document_new(sizeof(TestDocument));
    ui_document_regint(doc1, "check1", &doc1->check1);
    ui_document_regint(doc2, "check1", &doc2->check1);
    wdata->doc1 = doc1;
    wdata->doc2 = doc2;
    
    ui_set_document(window, doc1);
    
    //ui_button(window, "OK", action_open, NULL);
    ui_textarea(window, &wdata->text);
    
    //ui_window_addint(window, "check1");
    ui_show(window);
    ui_main();
    
    return (EXIT_SUCCESS);
}

mercurial