Initial release of Maemo 5 port of gnuplot
[gnuplot] / src / beos / GPWindow.cpp
diff --git a/src/beos/GPWindow.cpp b/src/beos/GPWindow.cpp
new file mode 100644 (file)
index 0000000..d8bd697
--- /dev/null
@@ -0,0 +1,332 @@
+/*[
+ * Copyright 1986 - 1993, 1998, 2004   Thomas Williams, Colin Kelley
+ *
+ * Permission to use, copy, and distribute this software and its
+ * documentation for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.
+ *
+ * Permission to modify the software is granted, but not the right to
+ * distribute the complete modified source code.  Modifications are to
+ * be distributed as patches to the released version.  Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ *   1. distribute the corresponding source modifications from the
+ *    released version in the form of a patch file along with the binaries,
+ *   2. add special version identification to distinguish your version
+ *    in addition to the base release version number,
+ *   3. provide your name and address as the primary contact for the
+ *    support of your modified version, and
+ *   4. retain our contact information in regard to use of the base
+ *    software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+#include <Application.h>
+#include <Messenger.h>
+#include <Message.h>
+#include <Alert.h>
+#include <Roster.h>
+#include <Window.h>
+#include <View.h>
+#include <MenuBar.h>
+#include <Menu.h>
+#include <MenuField.h>
+#include <Entry.h>
+#include <Path.h>
+#include <Box.h>
+#include <MenuItem.h>
+#include <TextView.h>
+#include <FilePanel.h>
+#include <ScrollView.h>
+#include <OutlineListView.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "constants.h"
+#include "GPApp.h"
+#include "GPBitmap.h"
+#include "GPView.h"
+#include "GPWindow.h"
+
+// Constructs the window we'll be drawing into.
+//
+GPWindow::GPWindow(BRect frame)
+                       : BWindow(frame, " ", B_TITLED_WINDOW, 0) {
+       _InitWindow();
+       Show();
+}
+
+
+// Create a window from a file.
+//
+GPWindow::GPWindow(BRect frame, plot_struct *plot)
+                       : BWindow(frame, "Untitled ", B_TITLED_WINDOW, 0) {
+       
+       _InitWindow();
+       
+       Show();
+}
+
+
+void GPWindow::_InitWindow(void) {
+       BRect r, rtool, plotframe;
+       BMenu *menu;
+       BMenuItem *item;
+
+        
+       // Initialize variables
+       
+       savemessage = NULL;                     // No saved path yet
+       r = rtool = plotframe = Bounds();
+//     rtool = Bounds();
+//     plotframe = Bounds();
+       
+       // Add the menu bar
+       menubar = new BMenuBar(r, "menu_bar");
+
+       // Add File menu to menu bar
+       menu = new BMenu("File");
+       menu->AddItem(new BMenuItem("New", new BMessage(MENU_FILE_NEW), 'N'));
+       
+       menu->AddItem(item=new BMenuItem("Open" B_UTF8_ELLIPSIS, new BMessage(MENU_FILE_OPEN), 'O'));
+       item->SetTarget(be_app);
+       menu->AddItem(new BMenuItem("Close", new BMessage(MENU_FILE_CLOSE), 'W'));
+       menu->AddSeparatorItem();
+       menu->AddItem(saveitem=new BMenuItem("Save", new BMessage(MENU_FILE_SAVE), 'S'));
+       saveitem->SetEnabled(false);
+       menu->AddItem(new BMenuItem("Save as" B_UTF8_ELLIPSIS, new BMessage(MENU_FILE_SAVEAS)));
+                                       
+       menu->AddSeparatorItem();
+       menu->AddItem(item=new BMenuItem("Page Setup" B_UTF8_ELLIPSIS, new BMessage(MENU_FILE_PAGESETUP)));
+       item->SetEnabled(false);
+       menu->AddItem(item=new BMenuItem("Print" B_UTF8_ELLIPSIS, new BMessage(MENU_FILE_PRINT), 'P'));
+       item->SetEnabled(false);
+
+       menu->AddSeparatorItem();
+       menu->AddItem(new BMenuItem("Quit", new BMessage(MENU_FILE_QUIT), 'Q'));
+       menubar->AddItem(menu);
+       
+       // Attach the menu bar to the window
+       AddChild(menubar);
+       
+       // Add the plot view
+//     plotframe.left +=rtool.right+5;
+       plotframe.top = menubar->Bounds().bottom+2;
+//     plotframe.right -= B_V_SCROLL_BAR_WIDTH;
+//     plotframe.bottom -= B_H_SCROLL_BAR_HEIGHT;
+       
+       BRect plotrect = plotframe;
+       plotrect.OffsetTo(B_ORIGIN);
+       r.InsetBy(3.0,3.0);
+       
+       plotview = new GPView(plotframe, B_FOLLOW_ALL_SIDES, B_WILL_DRAW|B_PULSE_NEEDED, NULL);
+//     plotview = new BView(plotframe, "test", B_FOLLOW_ALL_SIDES, B_WILL_DRAW|B_PULSE_NEEDED);
+       AddChild(plotview);
+       //help menu
+       menu = new BMenu("Help");
+       menu->AddItem(new BMenuItem("Help",new BMessage(MENU_HELP_REQUESTED)));
+       menu->AddItem(new BMenuItem("About...",new BMessage(MENU_HELP_ABOUT)));
+       
+       menubar->AddItem(menu);
+       
+       // Create the save filepanel for this window
+       
+       savePanel = new BFilePanel(B_SAVE_PANEL, new BMessenger(this), NULL, B_FILE_NODE, false);
+
+       // Tell the application that there's one more window
+       // and get the number for this untitled window.
+       Register(true);
+       Minimize(false);                // So Show() doesn't really make it visible
+}
+
+
+//
+// GPWindow::FrameResized
+//
+// Adjust the size of the BTextView's text rectangle
+// when the window is resized.
+//
+void GPWindow::FrameResized(float width, float height) {
+       BRect plotrect = plotview->Bounds();
+       
+       plotrect.right = plotrect.left + (width - 3.0);
+//     plotview->SetTextRect(plotrect);
+}
+
+
+//
+// GPWindow::~GPWindow
+//
+// Destruct the window.  This calls Unregister().
+//
+GPWindow::~GPWindow() {
+       Unregister();
+       if (savemessage) {
+               delete savemessage;
+       }
+       delete savePanel;
+}
+
+
+//
+// GPWindow::MessageReceived
+//
+// Called when a message is received by our
+// application.
+//
+void GPWindow::MessageReceived(BMessage *message) {
+
+       switch(message->what) {
+
+               case WINDOW_REGISTRY_ADDED:
+                       {
+                               char s[22];
+                               BRect rect;
+                               if (message->FindInt32("new_window_number", &window_id) == B_OK) {
+                                       if (!savemessage) {             // if it's untitled
+                                               sprintf(s, "File%ld.html", window_id);
+                                               SetTitle(s);
+                                       }
+                               }
+                               if (message->FindRect("rect", &rect) == B_OK) {
+                                       MoveTo(rect.LeftTop());
+                                       ResizeTo(rect.Width(), rect.Height());
+                               }
+                               Minimize(false);
+                       }
+                       break;
+                       
+               case MENU_FILE_NEW:
+                       {
+                               BRect r;
+                               r = Frame();
+                               new GPWindow(r);
+                       }
+                       break;
+               
+               case MENU_FILE_CLOSE:
+                       Quit();
+                       break;
+               case MENU_FILE_QUIT:
+                       be_app->PostMessage(B_QUIT_REQUESTED);
+                       break;
+               case MENU_FILE_SAVEAS:
+                       savePanel->Show();
+                       break;
+               case MENU_FILE_SAVE:
+                       Save(NULL);
+                       break;
+               case B_SAVE_REQUESTED:
+                       Save(message);
+                       break;
+               
+               case MENU_HELP_REQUESTED:{
+               int arg_c;
+               char **_arg;
+               arg_c=1;
+               _arg = (char **)malloc(sizeof(char *) * (arg_c+ 1));
+               _arg[0]="/boot/home/peojects/WebEditor/help.html";
+               _arg[1]=NULL;
+               be_roster->Launch("application/x-vnd.Be-NPOS",arg_c,_arg,NULL);
+               free(_arg);
+               }       
+               break; 
+               
+               case MENU_HELP_ABOUT:{
+                       BAlert          *alert;
+                       alert= new BAlert("About ", "WebEditor for BeOS™\n©François Jouen 1999.\ne-mail:jouen@epeire.univ-rouen.fr", "OK");
+                       alert->Go();
+       
+               }       
+               break;                          
+                                       
+//             case B_MOUSE_UP:
+//                     printf("gor something\n");
+//             break;                          
+
+               case bmsgNewCmd:
+               case bmsgClrCmd:
+               case bmsgBitmapDirty:
+               case bmsgBitmapResize:
+//                     printf("gor something\n");
+                       plotview->MessageReceived(message);
+               break;                          
+                                       
+               default:
+                       BWindow::MessageReceived(message);
+                       break;
+       }
+}
+
+
+//
+// GPWindow::Register
+//
+// Since MessageWorld can have multiple windows and
+// we need to know when there aren't any left so the
+// application can be shut down, this function is used
+// to tell the application that a new window has been
+// opened.
+//
+// If the need_id argument is true, we'll specify true
+// for the "need_id" field in the message we send; this
+// will cause the application to send back a
+// WINDOW_REGISTRY_ADDED message containing the window's
+// unique ID number.  If this argument is false, we won't
+// request an ID.
+//
+void GPWindow::Register(bool need_id) {
+       BMessenger messenger(APP_SIGNATURE);
+       BMessage message(WINDOW_REGISTRY_ADD);
+       
+       message.AddBool("need_id", need_id);
+       messenger.SendMessage(&message, this);
+}
+
+
+//
+// GPWindow::Unregister
+//
+// Unregisters a window.  This tells the application that
+// one fewer windows are open.  The application will
+// automatically quit if the count goes to zero because
+// of this call.
+//
+void GPWindow::Unregister(void) {
+       BMessenger messenger(APP_SIGNATURE);
+       
+       messenger.SendMessage(new BMessage(WINDOW_REGISTRY_SUB));
+}
+
+
+//
+// GPWindow::QuitRequested
+//
+// Here we just give permission to close the window.
+//
+bool GPWindow::QuitRequested() {
+       return true;
+}
+
+
+//
+// GPWindow::Save
+//
+// Save the contents of the window.  The message specifies
+// where to save it (see BFilePanel in the Storage Kit chapter
+// of the Be Book).
+//
+status_t GPWindow::Save(BMessage *message) {
+       entry_ref ref;          // For the directory to save into
+       status_t err = B_OK;            // For the return code
+
+       return err;
+}