home *** CD-ROM | disk | FTP | other *** search
- #include <IV-look/kit.h>
- #include <InterViews/adjust.h>
- #include <InterViews/background.h>
- #include <InterViews/box.h>
- #include <InterViews/character.h>
- #include <InterViews/composition.h>
- #include <InterViews/discretion.h>
- #include <InterViews/font.h>
- #include <InterViews/glue.h>
- #include <InterViews/label.h>
- #include <InterViews/texcomp.h>
- #include <InterViews/patch.h>
- #include <InterViews/place.h>
- #include <InterViews/scrbox.h>
- #include <InterViews/session.h>
- #include <InterViews/shapeof.h>
- #include <InterViews/space.h>
- #include <InterViews/strut.h>
- #include <InterViews/style.h>
- #include <InterViews/window.h>
- #include <OS/file.h>
- #include <OS/math.h>
- #include <OS/string.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- class DocumentView : public MonoGlyph {
- public:
- DocumentView(InputFile*, Style*);
- virtual ~DocumentView();
-
- virtual Adjustable* adjustable() const;
- private:
- Composition* page_;
- ScrollBox* box_;
- Style* style_;
- Glyph* begin_par_;
- Glyph* end_par_;
- Glyph* begin_line_;
- Glyph* end_line_;
- Glyph* word_space_;
- Glyph* interline_;
- Glyph* vfil_glue_;
-
- void add(const String&, Style*);
- };
-
- int main(int argc, char** argv) {
- Session* session = new Session("Text", argc, argv);
- if (argc != 2) {
- fprintf(stderr, "Usage: %s file\n", argv[0]);
- exit(1);
- }
- Style* style = session->style();
- Kit* kit = Kit::instance();
- InputFile* file = InputFile::open(argv[1]);
- if (file == nil) {
- fprintf(stderr, "can't open %s\n", argv[1]);
- exit(1);
- }
- DocumentView* view = new DocumentView(file, style);
- return session->run_window(
- new ApplicationWindow(
- new LRBox(
- kit->inset_frame(
- kit->vscroll_bar(view->adjustable(), style),
- style
- ),
- kit->inset_frame(
- new Background(
- new NaturalSpan(
- new VCenter(view, 1.0),
- Coord(4*72.0), Coord(6*72.0)
- ),
- style->background()
- ),
- style
- )
- )
- )
- );
- }
-
- DocumentView::DocumentView(InputFile* file, Style* s) {
- style_ = s;
- const Font* f = s->font();
- const Color* fg = s->foreground();
- // word_space_ = new Space(2, 0.5, f, fg);
- word_space_ = new Character(' ', f, fg);
- interline_ = new VGlue(0);
- vfil_glue_ = new VGlue(0, fil, 0);
-
- // left-align
- begin_line_ = new VStrut(0);
- end_line_ = new Strut(f, 0, fil, 0);
- begin_par_ = new VStrut(0);
- end_par_ = new Strut(f, 0, fil, 0);
-
- // right-align
- // begin_line_ = new VStrut(0, 0, 0, fil, 0);
- // end_line_ = new Strut(f);
- // begin_par_ = new VStrut(0, 0, 0, fil, 0);
- // end_par_ = new Strut(f);
-
- // center
- // begin_line_ = new VStrut(0, 0, 0, fil, 0);
- // end_line_ = new Strut(f, 0, fil, 0);
- // begin_par_ = new VStrut(0, 0, 0, fil, 0);
- // end_par_ = new Strut(f, 0, fil, 0);
-
- // justify
- // begin_line_ = new VStrut(0);
- // end_line_ = new Strut(f);
- // begin_par_ = new VStrut(0);
- // end_par_ = new Strut(f, 0, fil, 0);
-
- Resource::ref(begin_par_);
- Resource::ref(end_par_);
- Resource::ref(begin_line_);
- Resource::ref(end_line_);
- Resource::ref(word_space_);
- Resource::ref(interline_);
- Resource::ref(vfil_glue_);
-
- box_ = new TBScrollBox;
- page_ = new LRComposition(
- box_, new TeXCompositor(10), nil, 6*72.0, fil, fil, file->length()
- );
- const char* data;
- for (;;) {
- int len = file->read(data);
- if (len <= 0) {
- break;
- }
- add(String(data, len), s);
- }
- page_->append(vfil_glue_);
- page_->repair();
- body(page_);
- }
-
- DocumentView::~DocumentView() {
- Resource::unref(begin_par_);
- Resource::unref(end_par_);
- Resource::unref(begin_line_);
- Resource::unref(end_line_);
- Resource::unref(word_space_);
- Resource::unref(interline_);
- Resource::unref(vfil_glue_);
- }
-
- void DocumentView::add(const String& data, Style* s) {
- const char* p = data.string();
- const char* end = p + data.length();
- const Font* f = s->font();
- const Color* fg = s->foreground();
- Glyph* g[256];
- for (int i = 0; i < 256; i++) {
- g[i] = new Character(i, f, fg);
- }
-
- Resource::unref(g['\n']);
- g['\n'] = new Discretionary(
- PenaltyGood,
- end_par_,
- end_par_,
- new Discretionary(0, interline_, vfil_glue_, nil, nil),
- begin_par_
- );
-
- Resource::unref(g[' ']);
- g[' '] = new Discretionary(
- 0,
- word_space_,
- end_line_,
- new Discretionary(0, interline_, vfil_glue_, nil, nil),
- begin_line_
- );
-
- Resource::unref(g['\t']);
- // g['\t'] = new ShapeOf(g['M']);
- g['\t'] = new Label(" ", f, fg);
-
- for (; p < end; p++) {
- page_->append(g[*p]);
- }
- }
-
- Adjustable* DocumentView::adjustable() const {
- return box_;
- }
-