|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: A T
Length: 8619 (0x21ab) Types: TextFile Names: »Application.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/doc/Application.c«
/* * Copyright (c) 1991 Stanford University * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Stanford not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Stanford makes no representations about * the suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Application */ #include "Application.h" #include "Document.h" #include "DocViewer.h" #include "DialogMgr.h" #include "properties.h" #include <InterViews/event.h> #include <InterViews/world.h> #include <fstream.h> #include <strstream.h> #include <string.h> #ifndef __GNUC__ #include <stdlib.h> #endif #include <sys/types.h> #include <sys/stat.h> static int DEFAULT_SIZE_HINT = 1000; static const char* MAGIC = "%Doc-"; class ApplicationViewerInfo { public: DocumentViewer* _viewer; DialogManager* _dialogs; char* _window_name; char* _icon_name; }; #include "list.h" declareList(ApplicationViewerInfo_List,ApplicationViewerInfo) implementList(ApplicationViewerInfo_List,ApplicationViewerInfo) static int viewer_info( DocumentViewer* viewer, ApplicationViewerInfo_List* viewers ) { long count = viewers->count(); for (long i = 0; i < count; ++i) { ApplicationViewerInfo& info = viewers->item(i); if (info._viewer == viewer) { return i; } } return -1; } Application::Application () { _world = World::current(); _viewer = new ApplicationViewerInfo_List; } Application::~Application () { delete _viewer; } void Application::run () { Event e; while (_viewer->count() > 0) { _world->read(e); e.handle(); } } const char* Application::choose ( DocumentViewer* viewer, const char* prompt, const char* filter ) { ApplicationViewerInfo& info = _viewer->item(viewer_info(viewer, _viewer)); info._viewer->raise(); return info._dialogs->choose(info._viewer, prompt, filter); } const char* Application::ask ( DocumentViewer* viewer, const char* prompt, const char* initial ) { ApplicationViewerInfo& info = _viewer->item(viewer_info(viewer, _viewer)); info._viewer->raise(); return info._dialogs->ask(info._viewer, prompt, initial); } int Application::confirm (DocumentViewer* viewer, const char* prompt) { ApplicationViewerInfo& info = _viewer->item(viewer_info(viewer, _viewer)); info._viewer->raise(); return info._dialogs->confirm(info._viewer, prompt); } void Application::report (DocumentViewer* viewer, const char* prompt) { ApplicationViewerInfo& info = _viewer->item(viewer_info(viewer, _viewer)); info._viewer->raise(); info._dialogs->report(info._viewer, prompt); } void Application::complain (DocumentViewer* viewer, const char* prompt) { const char* complaint = _world->property_value(COMPLAINT_MODE); if (complaint == nil) { _world->RingBell(10); } else if (strcmp(complaint, "report") == 0) { report(viewer, prompt); } else if (strcmp(complaint, "bell") == 0) { _world->RingBell(10); } else if (strcmp(complaint, "ignore") == 0) { ; } else { _world->RingBell(10); } } void Application::open (DocumentViewer* viewer) { long index = viewer_info(viewer, _viewer); if (index < 0) { index = _viewer->count(); ApplicationViewerInfo info; info._dialogs = new DialogManager(); info._viewer = viewer; info._viewer->ref(); info._viewer->map(); info._window_name = nil; info._icon_name = nil; _viewer->append(info); } ApplicationViewerInfo& info = _viewer->item(index); const char* name = viewer->document()->name(); if (info._window_name == nil || strcmp(info._window_name, name) != 0) { delete info._window_name; delete info._icon_name; if (name != nil) { info._window_name = strcpy(new char[strlen(name) + 1], name); const char* icon_name = strrchr(name, '/'); if (icon_name != nil) { icon_name += 1; } else { icon_name = name; } info._icon_name = strcpy(new char[strlen(name) + 1], name); info._viewer->name(info._window_name); info._viewer->icon_name(info._icon_name); } else { info._window_name = nil; info._icon_name = nil; } } } void Application::close (DocumentViewer* viewer) { int index = viewer_info(viewer, _viewer); if (index >= 0) { ApplicationViewerInfo& info = _viewer->item(index); info._viewer->unmap(); info._viewer->unref(); delete info._dialogs; delete info._window_name; delete info._icon_name; _viewer->remove(index); } } Document* Application::read (const char* file_name) { Document* document = nil; struct stat filestats; if (strlen(file_name) > 0 && stat(file_name, &filestats) == 0) { ifstream in(file_name); char buffer[256]; in.getline(buffer, 256); in.seekg(0); char* version = strrchr(buffer, MAGIC[0]); int l = strlen(MAGIC); if ( version == nil || ( strncmp(version, MAGIC, l) == 0 && strcmp(version + l, _world->property_value(VERSION))==0 ) ) { document = new Document(this, int(filestats.st_size)); document->read(in); } } else { document = new Document(this, DEFAULT_SIZE_HINT); strstream empty; empty << MAGIC; empty << _world->property_value(VERSION); empty << "\n"; empty << "\\documentstyle{"; empty << _world->property_value(DEFAULT_STYLE); empty << "}\n"; empty.seekg(0); document->read(empty); } if (document != nil) { document->touch(false); document->notify(); } return document; } void Application::write (Document* document, const char* name) { ofstream out(name); out << MAGIC; out << _world->property_value(VERSION); out << "\n"; document->write(out); document->touch(false); document->notify(); } boolean Application::file_path ( const char* name, const char* extension, const char* pathlist, char* path ) { struct stat filestats; char filename[256]; if (name[0] == '~' && name[1] == '/') { strcpy(filename, getenv("HOME")); strcat(filename, name+1); } else { strcpy(filename, name); } if (extension != nil && strrchr(filename, '.') <= strrchr(filename, '/')) { strcat(filename, "."); strcat(filename, extension); } if (filename[0] == '/') { strcpy(path, filename); return stat(path, &filestats) == 0; } else { char path_list[256]; strcpy(path_list, pathlist); char* p = strtok(path_list, ":"); while (p != nil) { strcpy(path, p); strcat(path, "/"); strcat(path, filename); if (stat(path, &filestats) == 0) { return true; } else { p = strtok(nil, ":"); } } return false; } } boolean Application::command (const char* command) { if (strncmp(command, "application", 11) == 0) { const char* keyword = command + 12; if (strcmp(keyword, "quit") == 0) { long count = _viewer->count(); for (long i = count-1; i >= 0; --i) { ApplicationViewerInfo& info = _viewer->item(i); info._viewer->ref(); info._viewer->command("viewer close"); info._viewer->unref(); } return true; } } return false; }