[BACK]Return to GPApp.cpp CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / beos

Annotation of OpenXM_contrib/gnuplot/beos/GPApp.cpp, Revision 1.1.1.1

1.1       ohara       1: /*[
                      2:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
                      3:  *
                      4:  * Permission to use, copy, and distribute this software and its
                      5:  * documentation for any purpose with or without fee is hereby granted,
                      6:  * provided that the above copyright notice appear in all copies and
                      7:  * that both that copyright notice and this permission notice appear
                      8:  * in supporting documentation.
                      9:  *
                     10:  * Permission to modify the software is granted, but not the right to
                     11:  * distribute the complete modified source code.  Modifications are to
                     12:  * be distributed as patches to the released version.  Permission to
                     13:  * distribute binaries produced by compiling modified sources is granted,
                     14:  * provided you
                     15:  *   1. distribute the corresponding source modifications from the
                     16:  *    released version in the form of a patch file along with the binaries,
                     17:  *   2. add special version identification to distinguish your version
                     18:  *    in addition to the base release version number,
                     19:  *   3. provide your name and address as the primary contact for the
                     20:  *    support of your modified version, and
                     21:  *   4. retain our contact information in regard to use of the base
                     22:  *    software.
                     23:  * Permission to distribute the released version of the source code along
                     24:  * with corresponding source modifications in the form of a patch file is
                     25:  * granted with same provisions 2 through 4 for binary distributions.
                     26:  *
                     27:  * This software is provided "as is" without express or implied warranty
                     28:  * to the extent permitted by applicable law.
                     29: ]*/
                     30:
                     31: #include <Application.h>
                     32: #include <Messenger.h>
                     33: #include <Message.h>
                     34: #include <Roster.h>
                     35: #include <Window.h>
                     36: #include <View.h>
                     37: #include <MenuBar.h>
                     38: #include <Menu.h>
                     39: #include <MenuItem.h>
                     40: #include <FilePanel.h>
                     41: #include <Path.h>
                     42: #include <Entry.h>
                     43: #include <TextView.h>
                     44: #include <ScrollView.h>
                     45: #include <string.h>
                     46: #include <stdio.h>
                     47: #include <stdlib.h>
                     48:
                     49: #include "constants.h"
                     50: #include "GPBitmap.h"
                     51: #include "GPView.h"
                     52: #include "GPApp.h"
                     53: #include "GPWindow.h"
                     54:
                     55: // Application's signature
                     56:
                     57: const char *APP_SIGNATURE                              = "application/x-vnd.Xingo-gnuplotViewer";
                     58:
                     59: BRect windowRect(50,50,600,400);
                     60:
                     61: //
                     62: // main
                     63: //
                     64: // The main() function's only real job in a basic BeOS
                     65: // application is to create the BApplication object
                     66: // and run it.
                     67: //
                     68: int main(void) {
                     69:        GPApp theApp;           // The application object
                     70:        theApp.Run();
                     71:        return 0;
                     72: }
                     73:
                     74: //
                     75: // GPApp::GPApp
                     76: //
                     77: // The constructor for the WEApp class.  This
                     78: // will create our window.
                     79: //
                     80: GPApp::GPApp()
                     81:                        : BApplication(APP_SIGNATURE) {
                     82:
                     83:        window_count = 0;                       // No windows yet
                     84:        next_untitled_number = 1;       // Next window is "Untitled 1"
                     85:
                     86:        // Create the Open file panel
                     87: //     openPanel = new BFilePanel;
                     88: }
                     89:
                     90:
                     91: //
                     92: // GPApp::MessageReceived
                     93: //
                     94: // Handle incoming messages.  In particular, handle the
                     95: // WINDOW_REGISTRY_ADD and WINDOW_REGISTRY_SUB messages.
                     96: //
                     97: void GPApp::MessageReceived(BMessage *message) {
                     98:        switch(message->what) {
                     99:                case WINDOW_REGISTRY_ADD:
                    100:                        {
                    101:                                bool need_id = false;
                    102:                                BMessage reply(WINDOW_REGISTRY_ADDED);
                    103:
                    104:                                if (message->FindBool("need_id", &need_id) == B_OK) {
                    105:                                        if (need_id) {
                    106:                                                reply.AddInt32("new_window_number", next_untitled_number);
                    107:                                                next_untitled_number++;
                    108:                                        }
                    109:                                        window_count++;
                    110:                                }
                    111:                                reply.AddRect("rect", windowRect);
                    112:                                windowRect.OffsetBy(20,20);
                    113:                                message->SendReply(&reply);
                    114:                                break;
                    115:                        }
                    116:                case WINDOW_REGISTRY_SUB:
                    117:                        window_count--;
                    118:                        if (!window_count) {
                    119:                                Quit();
                    120:                        }
                    121:                        break;
                    122:                case MENU_FILE_OPEN:
                    123: //                     openPanel->Show();              // Show the file panel
                    124:                        break;
                    125:                default:
                    126:                        BApplication::MessageReceived(message);
                    127:                        break;
                    128:        }
                    129: }
                    130:
                    131: //
                    132: // GPApp::RefsReceived
                    133: //
                    134: // Handle a refs received message.
                    135: //
                    136: void GPApp::RefsReceived(BMessage *message) {
                    137:        entry_ref       ref;            // The entry_ref to open
                    138:        status_t        err;            // The error code
                    139:        int32           ref_num;        // The index into the ref list
                    140:
                    141:        // Loop through the ref list and open each one
                    142: #if 0
                    143:        ref_num = 0;
                    144:        do {
                    145:                if ((err = message->FindRef("refs", ref_num, &ref)) != B_OK) {
                    146:                        return;
                    147:                }
                    148:                new GPWindow(windowRect, &ref);
                    149:                ref_num++;
                    150:        } while (1);
                    151: #endif
                    152: }
                    153:
                    154: void GPApp::ReadyToRun(void)
                    155: {
                    156:     io_thread = spawn_thread(&io_loop, "gnuplot io_loop", B_LOW_PRIORITY, NULL);
                    157:     resume_thread(io_thread);
                    158: }
                    159:
                    160: int32 GPApp::io_loop(void* data)
                    161: {
                    162:        static plot_struct      plot_array[MAX_WINDOWS];
                    163:        int32 res = 1;
                    164:        while(res)
                    165:                res = io_task(plot_array);
                    166:        return res;
                    167: }
                    168:
                    169: int32 GPApp::io_task(plot_struct *plot_array)
                    170: {
                    171:     char       buf[256];
                    172:        struct  plot_struct *plot = plot_array;
                    173:        FILE    *fp = stdin;
                    174:        BMessage msg(bmsgNewCmd);
                    175:        int             cnt = 0;
                    176:
                    177:        while (fgets(buf, 256, fp)) {
                    178: //             printf("Got : %s", buf);
                    179:                switch (*buf) {
                    180:                        case 'G':               /* enter graphics mode */
                    181:                        {
                    182:                                //printf("entering gfx mode\n");
                    183:                                int plot_number = atoi(buf + 1);        /* 0 if none specified */
                    184:
                    185:                                if (plot_number < 0 || plot_number >= MAX_WINDOWS)
                    186:                                        plot_number = 0;
                    187:
                    188:                                //printf("plot for window number %d\n", plot_number);
                    189:                                plot = plot_array + plot_number;
                    190:                                prepare_plot(plot, plot_number);
                    191:                                continue;
                    192:                        }
                    193:                        case 'E':               /* leave graphics mode / suspend */
                    194:                        {
                    195: //                             BMessage msg(bmsgBitmapDirty);
                    196:                                msg.AddInt32("numcmds",cnt);
                    197:                                msg.AddPointer("cmds", plot->commands);
                    198:                                if(plot->window)
                    199:                                        plot->window->PostMessage(&msg);
                    200: //                             printf("displaying %d cmds, %X at %X\n",cnt,plot->commands[0],&plot->commands[0]);
                    201: //                             display(plot);
                    202:                                cnt = 0;
                    203:                                return 1;
                    204:                        }
                    205:                        case 'R':               /* leave x11 mode */
                    206:                        {
                    207:                                //printf("leaving gfx mode\n");
                    208:                                return 0;
                    209:                        }
                    210:                        default:
                    211:                        {
                    212: //                             msg.AddString("cmd",buf);
                    213: //                             plot->window->PostMessage(&msg);
                    214:                                store_command(buf, plot);
                    215:                                cnt++;
                    216:                                continue;
                    217:                        }
                    218:                }
                    219:        }
                    220:        /* get here if fgets fails */
                    221:        return (feof(fp) || ferror(fp)) ? 0 : 1;
                    222: }
                    223:
                    224: void GPApp::prepare_plot(plot_struct *plot, int term_number)
                    225: {
                    226:        int i;
                    227:
                    228:        for (i = 0; i < plot->ncommands; ++i)
                    229:                free(plot->commands[i]);
                    230:        plot->ncommands = 0;
                    231:
                    232:        if (!plot->posn_flags) {
                    233:                /* first time this window has been used - use default or -geometry
                    234:                 * settings
                    235:                 */
                    236:                plot->posn_flags = 1;
                    237:                plot->x = 50;
                    238:                plot->y = 20;
                    239:                plot->width = 400;
                    240:                plot->height = 400;
                    241:        }
                    242:
                    243:        if (!plot->window) {
                    244:                windowRect.Set(plot->x,plot->y,plot->width,plot->height);
                    245:                plot->window = new GPWindow(windowRect);
                    246:        } else {
                    247:                BMessage msg(bmsgClrCmd);
                    248:                plot->window->PostMessage(&msg);
                    249:        }
                    250: }
                    251:
                    252: void GPApp::display(plot_struct *plot)
                    253: {
                    254:        BMessage msg(bmsgBitmapDirty);
                    255:        if(plot->window)
                    256:                plot->window->PostMessage(&msg);
                    257: }
                    258:
                    259: /* store a command in a plot structure */
                    260:
                    261: void GPApp::store_command(char *buffer, plot_struct *plot)
                    262: {
                    263:        char *p;
                    264: //     BMessage msg(bmsgNewCmd);
                    265:
                    266: //     FPRINTF((stderr, "Store in %d : %s", plot - plot_array, buffer));
                    267:
                    268:        if (plot->ncommands >= plot->max_commands) {
                    269:                plot->max_commands = plot->max_commands * 2 + 1;
                    270:                plot->commands = (plot->commands)
                    271:                        ? (char **) realloc(plot->commands, plot->max_commands * sizeof(char *))
                    272:                        : (char **) malloc(sizeof(char *));
                    273:        }
                    274:        p = (char *) malloc((unsigned) strlen(buffer) + 1);
                    275:        if (!plot->commands || !p) {
                    276:                fputs("gnuplot: can't get memory. aborted.\n", stderr);
                    277:                exit(1);
                    278:        }
                    279:        plot->commands[plot->ncommands++] = strcpy(p, buffer);
                    280:
                    281: //     msg.AddString("cmd",buffer);
                    282: //     plot->window->PostMessage(&msg);
                    283: }
                    284:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>