#include #include #include #include #include #include #include #include "embedded-view.h" #include "font-info.h" #include "lkb-tree.h" #include "lkb-avm.h" #include "lkb-chart.h" #include "lui-treebank.h" #include "lkb-protocol.h" #include "lui-genchart.h" void init_view(embedded_view_t *view, int x, int y, int dx, int dy) { view->w_x1 = x; view->w_y1 = y; view->use_width = dx - x; view->use_height = dy - y; view->vis_width = view->use_width - 15; view->vis_height = view->use_height - 15; view->m_x = view->m_y = -1; //printf("initview (%d %d %d %d) %d x %d\n", x, y, dx, dy, view->vis_width, view->vis_height); view->hscroll = yzAddScrollBar(x,y+view->vis_height, view->vis_width, 15, 1); view->vscroll = yzAddScrollBar(x+view->vis_width,y, 15, view->vis_height, 2); yzSetScrollBarPageSize(view->hscroll, view->vis_width); yzSetScrollBarPageSize(view->vscroll, view->vis_height); yzSetScrollBarMax(view->hscroll, view->width); yzSetScrollBarMax(view->vscroll, view->height); yzSetScrollBarPosition(view->hscroll, 0); yzSetScrollBarPosition(view->vscroll, 0); view->scroll_area = yzAddScrollArea(x, y, view->vis_width, view->vis_height, (void(*)(void*,int,int,int,int))view->update, (void(*)(void*,event_t))view->event, (void*)view); yzSetScrollBarArea(view->hscroll, view->scroll_area); yzSetScrollBarArea(view->vscroll, view->scroll_area); yzPenColor(30000, 30000, 30000); yzRect(x+view->vis_width, y+view->vis_height, x+view->use_width-1, y+view->use_height-1); } int embedded_avm_view_drag(char *type, int x, int y) { embedded_view_t *view; view = yzGetWindowData("embedded_view"); if(!view) { fprintf(stderr, "embedded_avm_view_drag callback: no view!\n"); return 0; } if(xw_x1 || yw_y1 || x>=view->w_x1+view->vis_width || y>=view->w_y1+view->vis_height) x=y=-1; else { x += yzGetScrollBarPosition(view->hscroll) - view->w_x1; y += yzGetScrollBarPosition(view->vscroll) - view->w_y1; } return avm_view_drag(view, type, x, y); } void embedded_view_event(event_t ev) { embedded_view_t *view; window_t *win; int x, y; view = yzGetWindowData("embedded_view"); if(!view) { fprintf(stderr, "embedded_view_event callback: no view!\n"); return; } //printf("got an embedded view event for window %s\n", yzGetSelectedWindow()->name); switch(ev.type) { case YZ_KEY_DOWN: if(view->capture_all_keys && view->event) view->event(view, ev); else switch(ev.key) { case 'q': _close: win = yzGetSelectedWindow(); close_view(view); deregister_window_manager(win); yzDeleteWindow(win); return; case 'p': if(view->postscript)view->postscript(view); break; case 'l': if(view->latex)view->latex(view); break; default: if(view->event)view->event(view, ev); break; } break; case YZ_WINDOW_RESIZE: //printf("resized window to %dx%d\n", ev.x, ev.y); resize_view(view, ev.x, ev.y); yzUpdateBuffer(YZ_BUFFER_FRONT); break; case YZ_WINDOW_CLOSE: goto _close; } if(view->mouse_moved) { if(-1 == yzQueryPointer(&x, &y))x=y=-1; else { if(xw_x1 || yw_y1 || x>=view->w_x1+view->vis_width || y>=view->w_y1+view->vis_height) x=y=-1; else { x += yzGetScrollBarPosition(view->hscroll) - view->w_x1; y += yzGetScrollBarPosition(view->vscroll) - view->w_y1; } } if(x != view->m_x || y != view->m_y) { view->m_x = x; view->m_y = y; view->mouse_moved(view, x, y); } } } void resize_view(embedded_view_t *view, int width, int height) { int x=view->w_x1, y=view->w_y1; // XXX should also save bot/right margins view->use_width = width - x; view->use_height = height - y; view->vis_width = view->use_width - 15; view->vis_height = view->use_height - 15; //printf("resizeview (%d %d %d %d) %d x %d\n", x, y, width, height, view->vis_width, view->vis_height); //printf(" -- "); show_clip(); yzResizeScrollArea(view->scroll_area, x, y, view->vis_width, view->vis_height); yzResizeScrollBar(view->hscroll, x,y+view->vis_height, view->vis_width, 15); yzResizeScrollBar(view->vscroll, x+view->vis_width,y, 15, view->vis_height); yzSetScrollBarPageSize(view->hscroll, view->vis_width); yzSetScrollBarPageSize(view->vscroll, view->vis_height); //printf("before drawscrollarea: "); show_clip(); yzDrawScrollArea(view->scroll_area); yzPenColor(30000, 30000, 30000); yzRect(x+view->vis_width, y+view->vis_height, x+view->use_width-1, y+view->use_height-1); } void close_view(embedded_view_t *view) { yzRemoveScrollBar(view->hscroll); yzRemoveScrollBar(view->vscroll); yzRemoveScrollArea(view->scroll_area); if(view->close)view->close(view); free(view); } void scroll_embedded_view_to(embedded_view_t *view, int x, int y) { yzPopClipRect(); yzPopOrigin(); yzBufferMode(YZ_BUFFER_BOTH); yzSetScrollBarPosition(view->hscroll, x - view->vis_width/2); yzSetScrollBarPosition(view->vscroll, y - view->vis_height/2); yzRecomputeScrollAreaClipping(view->scroll_area); } void set_embedded_view_size(embedded_view_t *view, int w, int h) { int cx1, cy1, cx2, cy2, ox, oy; yzPopOrigin2p(&ox, &oy); yzPopClipRect4p(&cx1, &cy1, &cx2, &cy2); yzBufferMode(YZ_BUFFER_BOTH); if(view->width != w) { view->width = w; yzSetScrollBarMax(view->hscroll, w); } if(view->height != h) { view->height = h; yzSetScrollBarMax(view->vscroll, h); } yzPushClipRect(cx1, cy1, cx2, cy2); yzPushOrigin(ox, oy); } extern font_info avm_bar_font, tree_bar_font, mtree_bar_font, chart_bar_font; int top_bar_height(struct font_info *fnt) { return font_line_height(fnt) + 4; } window_t *find_window_by_object_id(int id) { int i; for(i=0;iwidth,w->height); yzPenColor(0,0,0); return w; } } return yzNewWindow(name, width, height); } void new_treebank_session(lui_treebank_session *session, char *title) { extern embedded_view_t prototype_treebank_view; window_t *window; embedded_view_t *treebank_view; int w_width, w_height; treebank_view = calloc(sizeof(*treebank_view), 1); *treebank_view = prototype_treebank_view; treebank_view->private = 0; if(treebank_view->init(treebank_view, session->id, session))return; w_width = treebank_view->width + 16; w_height = treebank_view->height + 16 + top_bar_height(&tree_bar_font)+1;//tree_bar_font.size*1.3+1; if(w_width>800)w_width = 800; if(w_height>600)w_height = 600; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(treebank_view, 0, top_bar_height(&tree_bar_font)+1, window->width, window->height); yzPutWindowData("embedded_view", treebank_view); yzPutWindowData("object_id", (void*)(long)session->id); register_window_manager(window, embedded_view_event, 0, wmTypeTreebank); free(title); } void browse_tree(int id, lkb_tree *tree, char *title) { extern embedded_view_t prototype_tree_view; window_t *window; embedded_view_t *tree_view; int w_width, w_height; tree_view = calloc(sizeof(*tree_view), 1); *tree_view = prototype_tree_view; tree_view->private = 0; if(tree_view->init(tree_view, id, tree))return; w_width = tree_view->width + 16; w_height = tree_view->height + 16 + top_bar_height(&tree_bar_font)+1;//tree_bar_font.size*1.3+1; if(w_width>800)w_width = 800; if(w_height>600)w_height = 600; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(tree_view, 0, top_bar_height(&tree_bar_font)+1, window->width, window->height); yzPutWindowData("embedded_view", tree_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, 0, wmTypeTree); free(title); } void browse_mtree(int winid, int count, int *ids, lkb_tree **trees, char **titles, char *title) { extern embedded_view_t prototype_mtree_view; window_t *window; embedded_view_t *tree_view; int w_width, w_height; tree_view = calloc(sizeof(*tree_view), 1); *tree_view = prototype_mtree_view; tree_view->private = 0; if(tree_view->init(tree_view, count, ids, trees, titles))return; w_width = tree_view->width + 16; w_height = tree_view->height + 16 + top_bar_height(&mtree_bar_font)+1; if(w_width>800)w_width = 800; if(w_height>600)w_height = 600; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(tree_view, 0, top_bar_height(&mtree_bar_font)+1, window->width, window->height); yzPutWindowData("embedded_view", tree_view); yzPutWindowData("object_id", (void*)(long)winid); register_window_manager(window, embedded_view_event, 0, wmTypeTree); free(title); } void browse_avm(int id, lkb_avm *avm, char *title, lui_list *failures) { extern embedded_view_t prototype_avm_view; window_t *window; embedded_view_t *avm_view; int w_width, w_height; avm_view = calloc(sizeof(*avm_view), 1); *avm_view = prototype_avm_view; avm_view->private = 0; if(avm_view->init(avm_view, id, avm, failures))return; w_width = avm_view->width + 16; w_height = avm_view->height + 16 + top_bar_height(&avm_bar_font)+1; if(w_width>900)w_width = 900; if(w_height>700)w_height = 700; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(avm_view, 0, top_bar_height(&avm_bar_font)+1, window->width, window->height); yzPutWindowData("embedded_view", avm_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, embedded_avm_view_drag, wmTypeAVM); yzPushOrigin(0,0); yzPushClipRect(0,0,window->width,window->height); prescroll_avm_view(avm_view); yzPopOrigin(); yzPopClipRect(); free(title); } void browse_chart(int id, lkb_chart *chart, char *title) { extern embedded_view_t prototype_chart_view; window_t *window; embedded_view_t *chart_view; int w_width, w_height; chart_view = calloc(sizeof(*chart_view), 1); *chart_view = prototype_chart_view; chart_view->private = 0; if(chart_view->init(chart_view, id, chart, title))return; w_width = chart_view->width + 16; //w_height = chart_view->height + 16 + 20; w_height = chart_view->height + 16 + top_bar_height(&chart_bar_font)+1; if(w_width>900)w_width = 900; if(w_height>700)w_height = 700; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(chart_view, 0, top_bar_height(&chart_bar_font)+1, window->width, window->height); yzPutWindowData("embedded_view", chart_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, 0, wmTypeChart); // chart owns 'title', don't free() it. } void browse_xtext(int id, lui_xtext *text, int nmenus, struct lui_xtext_menu **menus, char *title) { extern embedded_view_t prototype_xtext_view; window_t *window; embedded_view_t *xtext_view; int w_width, w_height; xtext_view = calloc(sizeof(*xtext_view), 1); *xtext_view = prototype_xtext_view; xtext_view->private = 0; if(xtext_view->init((void*)(long)id, xtext_view, text, nmenus, menus))return; w_width = xtext_view->width + 16; //w_height = xtext_view->height + 16 + 20; w_height = xtext_view->height + 16; if(w_width>900)w_width = 900; if(w_height>700)w_height = 700; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(xtext_view, 0, 0, window->width, window->height); yzPutWindowData("embedded_view", xtext_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, 0, wmTypeXText); free(title); } void browse_genchart(int id, lui_genchart *chart, char *title) { extern embedded_view_t prototype_genchart_view; window_t *window; embedded_view_t *genchart_view; int w_width, w_height; genchart_view = calloc(sizeof(*genchart_view), 1); *genchart_view = prototype_genchart_view; genchart_view->private = 0; if(genchart_view->init((void*)(long)id, genchart_view, chart))return; w_width = genchart_view->width + 16; //w_height = genchart_view->height + 16 + 20; w_height = genchart_view->height + 16; if(w_width>900)w_width = 900; if(w_height>700)w_height = 700; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(genchart_view, 0, 0, window->width, window->height); yzPutWindowData("embedded_view", genchart_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, 0, wmTypeGenChart); free(title); } void browse_hierarchy(int id, char *title, int ntypes, struct lui_hierarchy **types) { extern embedded_view_t prototype_hierarchy_view; window_t *window; embedded_view_t *hierarchy_view; int w_width, w_height; hierarchy_view = calloc(sizeof(*hierarchy_view), 1); *hierarchy_view = prototype_hierarchy_view; hierarchy_view->private = 0; if(hierarchy_view->init(hierarchy_view, id, title, ntypes, types))return; w_width = hierarchy_view->width + 16; w_height = hierarchy_view->height + 16; if(w_width>900)w_width = 900; if(w_height>700)w_height = 700; window = new_or_replaced_window(title, w_width, w_height); yzSelectWindow(window); init_view(hierarchy_view, 0, 0, window->width, window->height); yzPutWindowData("embedded_view", hierarchy_view); yzPutWindowData("object_id", (void*)(long)id); register_window_manager(window, embedded_view_event, NULL, wmTypeHierarchy); yzPushOrigin(0,0); yzPushClipRect(0,0,window->width,window->height); prescroll_hierarchy_view(hierarchy_view); yzPopOrigin(); yzPopClipRect(); free(title); } void do_chart_event(int cid, char *what, int edge) { int i; struct embedded_view *em; for(i=0;i