#define _DISPLAY_C
#include "openaxiom-c-macros.h"
#include "debug.h"
#include "sockio.h"
#include "extent.h"
#include "hyper.h"
#include "display.h"
#include "group.h"
#include "scrollbar.h"
#include "titlebar.h"
#include "parse-types.h"
extern ItemStack *gTopOfItemStack;
short int gDisplayRegion = 0;
int gRegionOffset = 0;
void
show_page(HyperDocPage *page)
{
XWindowChanges wc;
int doShowScrollBars = 1;
init_top_group();
XClearWindow(gXDisplay, gWindow->fMainWindow);
XClearWindow(gXDisplay, gWindow->fScrollWindow);
free_button_list(page->s_button_list);
page->s_button_list = NULL;
free_button_list(page->button_list);
page->button_list = NULL;
compute_title_extent(page);
compute_header_extent(page);
compute_footer_extent(page);
compute_scrolling_extent(page);
if (page->scrolling) {
int width, height;
calculateScrollBarMeasures();
wc.x = 0;
wc.y = page->top_scroll_margin + scroll_top_margin;
wc.height = gWindow->scrollheight;
if (gWindow->page->scrolling->height <= gWindow->scrollheight) {
gWindow->page->scroll_off = 0;
wc.width = gWindow->width;
}
else
wc.width = gWindow->width - gScrollbarWidth;
getScrollBarMinimumSize(&width, &height);
if (height > wc.height) {
wc.height = gWindow->scrollheight = 1;
doShowScrollBars = 0;
}
else
gWindow->scrollwidth = wc.width;
if (doShowScrollBars) {
XConfigureWindow(gXDisplay, gWindow->fScrollWindow, CWX | CWY | CWHeight | CWWidth, &wc);
XMapWindow(gXDisplay, gWindow->fScrollWindow);
}
else {
XUnmapWindow(gXDisplay, gWindow->fScrollWindow);
hideScrollBars(gWindow);
}
}
while (pop_group_stack() >= 0)
;
gWindow->fDisplayedWindow = gWindow->fMainWindow;
gRegionOffset = 0;
y_off = 0;
gDisplayRegion = Header;
show_text(page->header->next, openaxiom_Endheader_token);
if (doShowScrollBars && page->scrolling) {
if (page->footer->next) {
gDisplayRegion = Footer;
gRegionOffset = gWindow->page->bot_scroll_margin +
(!((gWindow->page->page_flags & NOLINES)) ? ((int) line_height / 2) : (0));
show_text(page->footer->next, openaxiom_Endfooter_token);
if (page->scrolling->next)
gDisplayRegion = Scrolling;
gRegionOffset = 0;
gWindow->fDisplayedWindow = gWindow->fScrollWindow;
y_off = gWindow->page->scroll_off;
show_text(page->scrolling->next, openaxiom_Endscrolling_token);
showScrollBars(gWindow);
}
drawScrollLines();
}
if (gTopOfItemStack != NULL) {
fprintf(stderr, "warning: unbalanced \\beginitems .. \\enditems\n");
gTopOfItemStack = NULL;
}
showTitleBar();
XFlush(gXDisplay);
}
void
expose_page(HyperDocPage *page)
{
int width, height, doShowScrollBars = 1;
init_top_group();
y_off = 0;
gWindow->fDisplayedWindow = gWindow->fMainWindow;
gRegionOffset = 0;
gDisplayRegion = Header;
show_text(page->header->next, openaxiom_Endheader_token);
getScrollBarMinimumSize(&width, &height);
if (page->scrolling) {
if (page->footer->next) {
gDisplayRegion = Footer;
gRegionOffset = gWindow->page->bot_scroll_margin +
(!((gWindow->page->page_flags & NOLINES)) ? ((int) line_height / 2) : (0));
show_text(page->footer->next, openaxiom_Endfooter_token);
}
if (height > gWindow->scrollheight) {
gWindow->scrollheight = 1;
doShowScrollBars = 0;
XUnmapWindow(gXDisplay, gWindow->fScrollWindow);
hideScrollBars(gWindow);
}
if (page->scrolling->next) {
gRegionOffset = page->top_scroll_margin;
gDisplayRegion = Scrolling;
gRegionOffset = 0;
gWindow->fDisplayedWindow = gWindow->fScrollWindow;
y_off = gWindow->page->scroll_off;
show_text(page->scrolling->next, openaxiom_Endscrolling_token);
if (doShowScrollBars)
showScrollBars(gWindow);
}
if (doShowScrollBars)
drawScrollLines();
}
showTitleBar();
XFlush(gXDisplay);
}
void
scroll_page(HyperDocPage *page)
{
init_top_group();
free_button_list(page->s_button_list);
page->s_button_list = NULL;
XUnmapSubwindows(gXDisplay, gWindow->fScrollWindow);
gDisplayRegion = Scrolling;
gRegionOffset = 0;
gWindow->fDisplayedWindow = gWindow->fScrollWindow;
y_off = gWindow->page->scroll_off;
show_text(page->scrolling->next, openaxiom_Endscrolling_token);
moveScroller(gWindow);
XFlush(gXDisplay);
}
void
paste_page(TextNode *node)
{
int width, height;
int old_off = gWindow->page->scroll_off;
free_button_list(gWindow->page->s_button_list);
gWindow->page->s_button_list = NULL;
free_button_list(gWindow->page->button_list);
gWindow->page->button_list = NULL;
XUnmapSubwindows(gXDisplay, gWindow->fScrollWindow);
init_top_group();
compute_scrolling_extent(gWindow->page);
calculateScrollBarMeasures();
getScrollBarMinimumSize(&width, &height);
gRegionOffset = 0;
y_off = gWindow->page->scroll_off;
gDisplayRegion = Scrolling;
gWindow->fDisplayedWindow = gWindow->fScrollWindow;
if (gWindow->page->scroll_off == old_off) {
XClearArea(gXDisplay, gWindow->fScrollWindow, 0,
node->y - line_height + gRegionOffset + y_off,
gWindow->width,
gWindow->scrollheight - node->y + line_height - y_off,
False);
XFlush(gXDisplay);
}
else
XClearWindow(gXDisplay, gWindow->fScrollWindow);
show_text(gWindow->page->scrolling->next, openaxiom_Endscrolling_token);
XFlush(gXDisplay);
hideScrollBars(gWindow);
if (height > gWindow->scrollheight) {
gWindow->scrollheight = 1;
XUnmapWindow(gXDisplay, gWindow->fScrollWindow);
}
else {
showScrollBars(gWindow);
drawScrollLines();
}
XFlush(gXDisplay);
}