472 } |
472 } |
473 |
473 |
474 |
474 |
475 /* document tabview */ |
475 /* document tabview */ |
476 |
476 |
|
477 static void ui_tabbar_resize(Widget widget, XtPointer udata, XtPointer cdata) { |
|
478 MotifTabbedPane *v = (MotifTabbedPane*)udata; |
|
479 |
|
480 int width = 0; |
|
481 int height = 0; |
|
482 XtVaGetValues(widget, XmNwidth, &width, XmNheight, &height, NULL); |
|
483 int button_width = width / 4; |
|
484 int x = 0; |
|
485 UCX_FOREACH(elm, v->tabs) { |
|
486 UiTab *tab = elm->data; |
|
487 XtVaSetValues( |
|
488 tab->tab_button, |
|
489 XmNx, x, |
|
490 XmNy, 0, |
|
491 XmNwidth, |
|
492 button_width, |
|
493 NULL); |
|
494 x += button_width; |
|
495 } |
|
496 } |
|
497 |
|
498 static void ui_tabbar_expose(Widget widget, XtPointer udata, XtPointer cdata) { |
|
499 MotifTabbedPane *v = (MotifTabbedPane*)udata; |
|
500 XmDrawingAreaCallbackStruct *cbs = (XmDrawingAreaCallbackStruct *)cdata; |
|
501 XEvent *event = cbs->event; |
|
502 } |
|
503 |
477 UiTabbedPane* ui_tabbed_document_view(UiObject *obj) { |
504 UiTabbedPane* ui_tabbed_document_view(UiObject *obj) { |
478 int n = 0; |
505 int n = 0; |
479 Arg args[16]; |
506 Arg args[16]; |
480 |
507 |
481 UiContainer *ct = uic_get_current_container(obj); |
508 UiContainer *ct = uic_get_current_container(obj); |
488 XtSetArg(args[1], XmNpacking, XmPACK_TIGHT); |
515 XtSetArg(args[1], XmNpacking, XmPACK_TIGHT); |
489 XtSetArg(args[2], XmNspacing, 1); |
516 XtSetArg(args[2], XmNspacing, 1); |
490 XtSetArg(args[3], XmNleftAttachment, XmATTACH_FORM); |
517 XtSetArg(args[3], XmNleftAttachment, XmATTACH_FORM); |
491 XtSetArg(args[4], XmNrightAttachment, XmATTACH_FORM); |
518 XtSetArg(args[4], XmNrightAttachment, XmATTACH_FORM); |
492 XtSetArg(args[5], XmNtopAttachment, XmATTACH_FORM); |
519 XtSetArg(args[5], XmNtopAttachment, XmATTACH_FORM); |
493 Widget tabbar = XmCreateForm(tabview, "toolbar", args, 6); |
520 XtSetArg(args[6], XmNmarginWidth, 0); |
|
521 XtSetArg(args[7], XmNmarginHeight, 0); |
|
522 Widget tabbar = XmCreateDrawingArea(tabview, "tabbar", args, 8); |
494 XtManageChild(tabbar); |
523 XtManageChild(tabbar); |
495 |
524 |
496 XtSetArg(args[0], XmNleftAttachment, XmATTACH_FORM); |
525 XtSetArg(args[0], XmNleftAttachment, XmATTACH_FORM); |
497 XtSetArg(args[1], XmNrightAttachment, XmATTACH_FORM); |
526 XtSetArg(args[1], XmNrightAttachment, XmATTACH_FORM); |
498 XtSetArg(args[2], XmNtopAttachment, XmATTACH_WIDGET); |
527 XtSetArg(args[2], XmNtopAttachment, XmATTACH_WIDGET); |
507 tabbedpane->view.widget = tabct; |
536 tabbedpane->view.widget = tabct; |
508 tabbedpane->view.document = NULL; |
537 tabbedpane->view.document = NULL; |
509 tabbedpane->tabbar = tabbar; |
538 tabbedpane->tabbar = tabbar; |
510 tabbedpane->tabs = NULL; |
539 tabbedpane->tabs = NULL; |
511 tabbedpane->current = NULL; |
540 tabbedpane->current = NULL; |
|
541 |
|
542 XGCValues gcv; |
|
543 |
|
544 XtAddCallback(tabbar, XmNresizeCallback , ui_tabbar_resize, tabbedpane); |
|
545 XtAddCallback(tabbar, XmNexposeCallback, ui_tabbar_expose, tabbedpane); |
512 |
546 |
513 return &tabbedpane->view; |
547 return &tabbedpane->view; |
514 } |
548 } |
515 |
549 |
516 UiObject* ui_document_tab(UiTabbedPane *view) { |
550 UiObject* ui_document_tab(UiTabbedPane *view) { |
549 // add tab button |
583 // add tab button |
550 v->tabs = ucx_list_append_a(view->ctx->mempool->allocator, v->tabs, tab); |
584 v->tabs = ucx_list_append_a(view->ctx->mempool->allocator, v->tabs, tab); |
551 |
585 |
552 XmString label = XmStringCreateLocalized("tab"); |
586 XmString label = XmStringCreateLocalized("tab"); |
553 XtSetArg(args[0], XmNlabelString, label); |
587 XtSetArg(args[0], XmNlabelString, label); |
554 XtSetArg(args[1], XmNshadowThickness, 1); |
588 XtSetArg(args[1], XmNshadowThickness, 0); |
555 XtSetArg(args[2], XmNtraversalOn, FALSE); |
589 XtSetArg(args[2], XmNhighlightThickness, 0); |
556 XtSetArg(args[3], XmNtopAttachment, XmATTACH_FORM); |
590 |
557 XtSetArg(args[4], XmNbottomAttachment, XmATTACH_FORM); |
591 Widget button = XmCreatePushButton(v->tabbar, "tab_button", args, 3); |
558 XtSetArg(args[5], XmNhighlightThickness, 0); |
|
559 XtSetArg(args[6], XmNindicatorOn, XmINDICATOR_NONE); |
|
560 XtSetArg(args[7], XmNfillOnSelect, TRUE); |
|
561 XtSetArg(args[8], XmNtopShadowColor, 1); |
|
562 |
|
563 Widget button = XmCreateToggleButton(v->tabbar, "tab_button", args, 8); |
|
564 tab->tabbedpane = v; |
592 tab->tabbedpane = v; |
565 tab->content = content; |
593 tab->content = content; |
566 tab->tab_button = button; |
594 tab->tab_button = button; |
567 |
|
568 // layout |
|
569 int is_first = 1; |
|
570 size_t count = ucx_list_size(v->tabs); |
|
571 int part = 100 / count; |
|
572 int pos = 0; |
|
573 int i = 0; |
|
574 UCX_FOREACH(elm, v->tabs) { |
|
575 UiTab *tt = elm->data; |
|
576 if(is_first) { |
|
577 XtVaSetValues( |
|
578 tt->tab_button, |
|
579 XmNleftAttachment, |
|
580 XmATTACH_FORM, |
|
581 XmNrightAttachment, |
|
582 XmATTACH_POSITION, |
|
583 XmNrightPosition, |
|
584 pos + part, |
|
585 XmNset, |
|
586 FALSE, |
|
587 NULL); |
|
588 is_first = FALSE; |
|
589 } else if(i < count - 1) { |
|
590 XtVaSetValues( |
|
591 tt->tab_button, |
|
592 XmNleftAttachment, |
|
593 XmATTACH_POSITION, |
|
594 XmNleftPosition, |
|
595 pos, |
|
596 XmNrightAttachment, |
|
597 XmATTACH_POSITION, |
|
598 XmNrightPosition, |
|
599 pos + part, |
|
600 XmNset, |
|
601 FALSE, |
|
602 NULL); |
|
603 } else { |
|
604 XtVaSetValues( |
|
605 tt->tab_button, |
|
606 XmNleftAttachment, |
|
607 XmATTACH_POSITION, |
|
608 XmNleftPosition, |
|
609 pos, |
|
610 XmNrightAttachment, |
|
611 XmATTACH_FORM, |
|
612 XmNset, |
|
613 FALSE, |
|
614 NULL); |
|
615 } |
|
616 pos += part; |
|
617 i++; |
|
618 } |
|
619 |
|
620 XtManageChild(button); |
595 XtManageChild(button); |
621 XtVaSetValues(button, XmNset, TRUE, NULL); |
|
622 XtAddCallback( |
596 XtAddCallback( |
623 button, |
597 button, |
624 XmNvalueChangedCallback, |
598 XmNactivateCallback, |
625 (XtCallbackProc)ui_tab_button_callback, |
599 (XtCallbackProc)ui_tab_button_callback, |
626 tab); |
600 tab); |
627 |
601 |
628 v->current = tab; |
|
629 ui_change_tab(v, tab); |
602 ui_change_tab(v, tab); |
|
603 ui_tabbar_resize(v->tabbar, v, NULL); |
630 |
604 |
631 return content; |
605 return content; |
632 } |
606 } |
633 |
607 |
634 void ui_tab_button_callback(Widget widget, UiTab *tab, XtPointer d) { |
608 void ui_tab_button_callback(Widget widget, UiTab *tab, XtPointer d) { |
637 XtUnmanageChild(t->current->content->widget); |
611 XtUnmanageChild(t->current->content->widget); |
638 XtVaSetValues(t->current->tab_button, XmNset, 0, NULL); |
612 XtVaSetValues(t->current->tab_button, XmNset, 0, NULL); |
639 } |
613 } |
640 XtManageChild(tab->content->widget); |
614 XtManageChild(tab->content->widget); |
641 |
615 |
642 t->current = tab; |
|
643 ui_change_tab(t, tab); |
616 ui_change_tab(t, tab); |
|
617 |
644 } |
618 } |
645 |
619 |
646 void ui_change_tab(MotifTabbedPane *pane, UiTab *tab) { |
620 void ui_change_tab(MotifTabbedPane *pane, UiTab *tab) { |
647 UiContext *ctx = tab->content->ctx; |
621 UiContext *ctx = tab->content->ctx; |
648 ctx->parent->set_document(ctx->parent, ctx->document); |
622 ctx->parent->set_document(ctx->parent, ctx->document); |
|
623 |
|
624 pane->current = tab; |
|
625 pane->index = ucx_list_find(pane->tabs, tab, NULL, NULL); |
|
626 printf("index: %d\n", pane->index); |
649 } |
627 } |
650 |
628 |
651 void ui_tab_set_document(UiContext *ctx, void *document) { |
629 void ui_tab_set_document(UiContext *ctx, void *document) { |
652 if(ctx->parent->document) { |
630 if(ctx->parent->document) { |
653 //ctx->parent->detach_document(ctx->parent, ctx->parent->document); |
631 //ctx->parent->detach_document(ctx->parent, ctx->parent->document); |