diff options
Diffstat (limited to 'BitEdit.c')
-rw-r--r-- | BitEdit.c | 1122 |
1 files changed, 1122 insertions, 0 deletions
diff --git a/BitEdit.c b/BitEdit.c new file mode 100644 index 0000000..7477392 --- /dev/null +++ b/BitEdit.c @@ -0,0 +1,1122 @@ +/* $Xorg: BitEdit.c,v 1.4 2001/02/09 02:05:28 xorgcvs Exp $ */ +/* + +Copyright 1989, 1998 The Open Group + +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. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * Author: Davor Matic, MIT X Consortium + */ + + + + +#include <stdio.h> +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> +#include <X11/Xaw/Paned.h> +#include <X11/Xaw/Form.h> +#include <X11/Xaw/Box.h> +#include <X11/Xaw/Command.h> +#include <X11/Xaw/Toggle.h> +#include <X11/Xaw/MenuButton.h> +#include <X11/Xaw/SimpleMenu.h> +#include <X11/Xaw/SmeLine.h> +#include <X11/Xaw/SmeBSB.h> +#include "Bitmap.h" + +#include <X11/bitmaps/xlogo16> + +static char *usage = "[-options ...] filename\n\ +\n\ +where options include all standard toolkit options plus:\n\ + -size WIDTHxHEIGHT\n\ + -sw dimension\n\ + -sh dimension\n\ + -gt dimension\n\ + -grid, +grid\n\ + -axes, +axes\n\ + -dashed, +dashed\n\ + -stippled, +stippled\n\ + -proportional, +proportional\n\ + -basename basename\n\ + -dashes filename\n\ + -stipple filename\n\ + -hl color\n\ + -fr color\n\ +\n\ +The default WIDTHxHEIGHT is 16x16.\n"; + +static XrmOptionDescRec options[] = { + { "-axes", "*bitmap.axes", XrmoptionNoArg, "True"}, + { "+axes", "*bitmap.axes", XrmoptionNoArg, "False"}, + { "-basename", "*bitmap.basename", XrmoptionSepArg, NULL}, + { "-dashed", "*bitmap.dashed", XrmoptionNoArg, "True"}, + { "+dashed", "*bitmap.dashed", XrmoptionNoArg, "False"}, + { "-dashes", "*bitmap.dashes", XrmoptionSepArg, NULL}, + { "-fr", "*bitmap.frame", XrmoptionSepArg, NULL}, + { "-gt", "*bitmap.gridTolerance",XrmoptionSepArg, NULL}, + { "-grid", "*bitmap.grid", XrmoptionNoArg, "True"}, + { "+grid", "*bitmap.grid", XrmoptionNoArg, "False"}, + { "-hl", "*bitmap.highlight", XrmoptionSepArg, NULL}, + { "-proportional","*bitmap.proportional", XrmoptionNoArg, "True"}, + { "+proportional","*bitmap.proportional", XrmoptionNoArg, "False"}, + { "-size", "*bitmap.size", XrmoptionSepArg, NULL}, + { "-sh", "*bitmap.squareHeight", XrmoptionSepArg, NULL}, + { "-sw", "*bitmap.squareWidth", XrmoptionSepArg, NULL}, + { "-stipple", "*bitmap.stipple", XrmoptionSepArg, NULL}, + { "-stippled", "*bitmap.stippled", XrmoptionNoArg, "True"}, + { "+stippled", "*bitmap.stippled", XrmoptionNoArg, "False"}, +}; + +typedef struct { + int id; + String name; + Boolean trap; + Widget widget; + } ButtonRec; + +static ButtonRec file_menu[] = { +#define New 101 + {New, "new", True}, +#define Load 102 + {Load, "load", True}, +#define Insert 103 + {Insert, "insert", True}, +#define Save 104 + {Save, "save", True}, +#define SaveAs 105 + {SaveAs, "saveAs", True}, +#define Resize 106 + {Resize, "resize", True}, +#define Rescale 107 + {Rescale, "rescale", True}, +#define Filename 108 + {Filename, "filename", True}, +#define Basename 109 + {Basename, "basename", True}, +#define Dummy -1 + {Dummy, "line", False}, +#define Quit 110 + {Quit, "quit", True}, +}; + +static ButtonRec edit_menu[] = { +#define Image 201 + {Image, "image", True}, +#define Grid 203 + {Grid, "grid", True}, +#define Dashed 204 + {Dashed, "dashed", True}, +#define Axes 205 + {Axes, "axes", True}, +#define Stippled 206 + {Stippled, "stippled", True}, +#define Proportional 207 + {Proportional, "proportional", True}, +#define Zoom 208 + {Zoom, "zoom", True}, +/* Dummy */ + {Dummy, "line", False}, +#define Cut 209 + {Cut, "cut", True}, +#define Copy 210 + {Copy, "copy", True}, +#define Paste 211 + {Paste, "paste", True}, +}; + +static ButtonRec buttons[] = { +/*#define Clear 1*/ + {Clear, "clear", False}, +/*#define Set 2*/ + {Set, "set", False}, +/*#define Invert 3*/ + {Invert, "invert", False}, +#define Mark 26 + {Mark, "mark", True}, +#define Unmark 27 + {Unmark, "unmark", False}, +#define CopyImm 4 + {CopyImm, "copy", True}, +#define MoveImm 5 + {MoveImm, "move", True}, +#define FlipHoriz 6 + {FlipHoriz, "flipHoriz", False}, +#define Up 7 + {Up, "up", False}, +#define FlipVert 8 + {FlipVert, "flipVert", False}, +#define Left 9 + {Left, "left", False}, +#define Fold 10 + {Fold, "fold", False}, +#define Right 11 + {Right, "right", False}, +#define RotateLeft 12 + {RotateLeft, "rotateLeft", False}, +#define Down 13 + {Down, "down", False}, +#define RotateRight 14 + {RotateRight, "rotateRight", False}, +#define Point 15 + {Point, "point", True}, +#define Curve 16 + {Curve, "curve", True}, +#define Line 17 + {Line, "line", True}, +#define Rectangle 18 + {Rectangle, "rectangle", True}, +#define FilledRectangle 19 + {FilledRectangle, "filledRectangle", True}, +#define Circle 20 + {Circle, "circle", True}, +#define FilledCircle 21 + {FilledCircle, "filledCircle", True}, +#define FloodFill 22 + {FloodFill, "floodFill", True}, +#define SetHotSpot 23 + {SetHotSpot, "setHotSpot", True}, +#define ClearHotSpot 24 + {ClearHotSpot, "clearHotSpot", False}, +#define Undo 25 + {Undo, "undo", False}, +}; + +#include "Dialog.h" + +static Widget + top_widget, + parent_widget, + formy_widget, + fileButton_widget, fileMenu_widget, + editButton_widget, editMenu_widget, + status_widget, + pane_widget, + form_widget, + bitmap_widget, + image_shell, + box_widget, + normal_image_widget, + inverted_image_widget; +static Boolean image_visible = False; +static Pixmap check_mark; +static Dialog input_dialog, error_dialog, qsave_dialog; +static Time btime; +static String filename = NULL, base_name = NULL, format; +static char message[80]; + + +void FixMenu(); +void SwitchImage(); +void SwitchGrid(); +void SwitchDashed(); +void SwitchAxes(); +void SwitchStippled(); +void SwitchProportional(); +void SwitchZoom(); +void DoCut(); +void DoCopy(); +void DoPaste(); +void DoNew(); +void DoLoad(); +void DoInsert(); +void DoSave(); +void DoSaveAs(); +void DoResize(); +void DoRescale(); +void DoFilename(); +void DoBasename(); +void DoQuit(); + +static XtActionsRec actions_table[] = { + {"fix-menu", FixMenu}, + {"switch-image", SwitchImage}, + {"switch-grid", SwitchGrid}, + {"switch-dashed", SwitchDashed}, + {"switch-axes", SwitchAxes}, + {"switch-stippled", SwitchStippled}, + {"switch-proportional", SwitchProportional}, + {"switch-zoom", SwitchZoom}, + {"do-cut", DoCut}, + {"do-copy", DoCopy}, + {"do-paste", DoPaste}, + {"do-new", DoNew}, + {"do-load", DoLoad}, + {"do-insert", DoInsert}, + {"do-save", DoSave}, + {"do-save-as", DoSaveAs}, + {"do-resize", DoResize}, + {"do-rescale", DoRescale}, + {"do-filename", DoFilename}, + {"do-basename", DoBasename}, + {"do-quit", DoQuit} +}; + +static Atom wm_delete_window; + +void FixImage() +{ + Pixmap old_image, image; + int n; + Arg wargs[2]; + + if (!image_visible) return; + + n=0; + XtSetArg(wargs[n], XtNbitmap, &old_image); n++; + XtGetValues(normal_image_widget, wargs, n); + + + image = BWGetUnzoomedPixmap(bitmap_widget); + + n=0; + XtSetArg(wargs[n], XtNbitmap, image); n++; + XtSetValues(normal_image_widget, wargs, n); + XtSetValues(inverted_image_widget, wargs, n); + + if (old_image != XtUnspecifiedPixmap) + XFreePixmap(XtDisplay(bitmap_widget), old_image); +} + +FixStatus() +{ + int n; + Arg wargs[2]; + String str, label; + + str = BWUnparseStatus(bitmap_widget); + + n=0; + XtSetArg(wargs[n], XtNlabel, &label); n++; + XtGetValues(status_widget, wargs, n); + + if (strcmp(str, label)) { + n = 0; + XtSetArg(wargs[n], XtNlabel, str); n++; + XtSetValues(status_widget, wargs, n); + } + + /*XtFree(str); */ +} + +void FixUp() +{ + FixImage(); + FixStatus(); +} + +void FixEntry(w, id) + Widget w; + int *id; +{ + int n; + Arg wargs[2]; + Time dummy = 0; + + n = 0; + + switch (*id) { + + case Image: + XtSetArg(wargs[n], XtNleftBitmap, + image_visible ? check_mark : None); n++; + break; + + case Grid: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryGrid(bitmap_widget) ? check_mark : None); n++; + break; + + case Dashed: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryDashed(bitmap_widget) ? check_mark : None); n++; + break; + + case Axes: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryAxes(bitmap_widget) ? check_mark : None); n++; + break; + + case Stippled: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryStippled(bitmap_widget) ? check_mark : None); n++; + break; + + case Proportional: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryProportional(bitmap_widget) ? check_mark : None); n++; + break; + + case Zoom: + XtSetArg(wargs[n], XtNleftBitmap, + BWQueryZooming(bitmap_widget) ? check_mark : None); n++; + break; + + case Copy: + case Cut: + XtSetArg(wargs[n], XtNsensitive, BWQueryMarked(bitmap_widget)); n++; + break; + + case Paste: + XtSetArg(wargs[n], XtNsensitive, + BWQuerySelection(bitmap_widget, dummy)); n++; + break; + + default: + return; + } + + XtSetValues(w, wargs, n); +} + +/* ARGSUSED */ +void FixMenu(w, event, params, num_params) + Widget w; + XEvent *event; + String *params; + Cardinal *num_params; +{ + int i; + + btime = event->xbutton.time; + + for (i = 0; i < XtNumber(edit_menu); i++) + FixEntry(edit_menu[i].widget, &edit_menu[i].id); +} + +static int zero = 0; +#define Plain (char *)&zero,sizeof(int) +/* ARGSUSED */ +void TheCallback(w, clientData, callData) + Widget w; /* not used */ + XtPointer clientData, callData; +{ + int *id = (int *)clientData; + switch (*id) { + + case New: + DoNew(); + break; + + case Load: + DoLoad(); + break; + + case Insert: + DoInsert(); + break; + + case Save: + DoSave(); + break; + + case SaveAs: + DoSaveAs(); + break; + + case Resize: + DoResize(); + break; + + case Rescale: + DoRescale(); + break; + + case Filename: + DoFilename(); + break; + + case Basename: + DoBasename(); + break; + + case Image: + SwitchImage(); + break; + + case Grid: + SwitchGrid(); + break; + + case Dashed: + SwitchDashed(); + break; + + case Axes: + SwitchAxes(); + break; + + case Stippled: + SwitchStippled(); + break; + + case Proportional: + SwitchProportional(); + break; + + case Zoom: + SwitchZoom(); + break; + + case Cut: + DoCut(); + break; + + case Copy: + DoCopy(); + break; + + case Paste: + DoPaste(); + break; + + case Clear: + BWStoreToBuffer(bitmap_widget); + BWClear(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Set: + BWStoreToBuffer(bitmap_widget); + BWSet(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); +break; + + case Invert: + BWStoreToBuffer(bitmap_widget); + BWInvert(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Mark: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, MarkRequest, True, Plain); + break; + + case Unmark: + BWUnmark(bitmap_widget); + break; + + case CopyImm: + BWRemoveAllRequests(bitmap_widget); + if (BWQueryMarked(bitmap_widget)) { + BWAddRequest(bitmap_widget, MarkRequest, False, Plain); + BWEngageRequest(bitmap_widget, CopyRequest, True, Plain); + } + else { + BWEngageRequest(bitmap_widget, MarkRequest, False, Plain); + BWAddRequest(bitmap_widget, CopyRequest, True, Plain); + } + break; + + case MoveImm: + BWRemoveAllRequests(bitmap_widget); + if (BWQueryMarked(bitmap_widget)) { + BWAddRequest(bitmap_widget, MarkRequest, False, Plain); + BWEngageRequest(bitmap_widget, MoveRequest, True, Plain); + } + else { + BWEngageRequest(bitmap_widget, MarkRequest, False, Plain); + BWAddRequest(bitmap_widget, MoveRequest, True, Plain); + } + break; + + case Up: + BWStoreToBuffer(bitmap_widget); + BWUp(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Down: + BWStoreToBuffer(bitmap_widget); + BWDown(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Left: + BWStoreToBuffer(bitmap_widget); + BWLeft(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Right: + BWStoreToBuffer(bitmap_widget); + BWRight(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Fold: + BWStoreToBuffer(bitmap_widget); + BWFold(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case FlipHoriz: + BWStoreToBuffer(bitmap_widget); + BWFlipHoriz(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case FlipVert: + BWStoreToBuffer(bitmap_widget); + BWFlipVert(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case RotateRight: + BWStoreToBuffer(bitmap_widget); + BWRotateRight(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case RotateLeft: + BWStoreToBuffer(bitmap_widget); + BWRotateLeft(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Point: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, PointRequest, True, Plain); + break; + + case Curve: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, CurveRequest, True, Plain); + break; + + case Line: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, LineRequest, True, Plain); + break; + + case Rectangle: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, RectangleRequest, True, Plain); + break; + + case FilledRectangle: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, FilledRectangleRequest, True, Plain); + break; + + case Circle: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, CircleRequest, True, Plain); + break; + + case FilledCircle: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, FilledCircleRequest, True, Plain); + break; + + case FloodFill: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, FloodFillRequest, True, Plain); + break; + + case SetHotSpot: + BWRemoveAllRequests(bitmap_widget); + BWEngageRequest(bitmap_widget, HotSpotRequest, True, Plain); + break; + + case ClearHotSpot: + BWStoreToBuffer(bitmap_widget); + BWClearHotSpot(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Undo: + BWUndo(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + break; + + case Quit: + DoQuit(bitmap_widget, NULL, NULL, NULL); + break; + } /* don't add anything below this line */ +} + +/* ARGSUSED */ + +void SwitchImage() +{ + if (image_visible) { + XtPopdown(image_shell); + image_visible = False; + } + else { + Position image_x, image_y; + int n; + Arg wargs[3]; + + XtTranslateCoords(bitmap_widget, + 10, 10, &image_x, &image_y); + + n = 0; + XtSetArg(wargs[n], XtNx, image_x); n++; + XtSetArg(wargs[n], XtNy, image_y); n++; + XtSetValues(image_shell, wargs, n); + + image_visible = True; + + FixImage(); + XtPopup(image_shell, XtGrabNone); + FixImage(); + } +} + +void SwitchGrid() +{ + BWSwitchGrid(bitmap_widget); +} + +void SwitchDashed() +{ + BWSwitchDashed(bitmap_widget); +} + +void SwitchAxes() +{ + BWSwitchAxes(bitmap_widget); +} + +void SwitchStippled() +{ + BWSwitchStippled(bitmap_widget); +} + +void SwitchProportional() +{ + BWSwitchProportional(bitmap_widget); +} + +void SwitchZoom() +{ + if (BWQueryZooming(bitmap_widget)) { + BWZoomOut(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + } + else { + if (BWQueryMarked(bitmap_widget)) { + BWStoreToBuffer(bitmap_widget); + BWZoomMarked(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + } + else { + BWEngageRequest(bitmap_widget, ZoomInRequest, False, Plain); + } + } +} + +void DoCut() +{ + BWStore(bitmap_widget); + BWStoreToBuffer(bitmap_widget); + BWClearMarked(bitmap_widget); + BWUnmark(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); +} + +void DoCopy() +{ + BWStore(bitmap_widget); + BWUnmark(bitmap_widget); +} + +void DoPaste() +{ + BWRequestSelection(bitmap_widget, btime, TRUE); + BWEngageRequest(bitmap_widget, RestoreRequest, False, Plain); +} + +void DoNew() +{ + BWGetFilename(bitmap_widget, &filename); + if (PopupDialog(input_dialog, "New file:", + filename, &filename, XtGrabExclusive) == Okay) { + BWChangeFilename(bitmap_widget, filename); + BWChangeBasename(bitmap_widget, filename); + BWStoreToBuffer(bitmap_widget); + BWClear(bitmap_widget); + BWClearHotSpot(bitmap_widget); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWClearChanged(bitmap_widget); + BWUnmark(bitmap_widget); + FixStatus(); + } +} + +void DoLoad() +{ + if (BWQueryChanged(bitmap_widget)) { + BWGetFilename(bitmap_widget, &filename); + RetryLoadSave: + switch (PopupDialog(qsave_dialog, "Save file before loading?", + filename, &filename, XtGrabExclusive)) { + case Yes: + if (BWWriteFile(bitmap_widget, filename, NULL) + != BitmapSuccess) { + sprintf(message, "Can't write file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryLoadSave; + } + break; + + case Cancel: + return; + } + } + BWGetFilepath(bitmap_widget, &filename); + RetryLoad: + if (PopupDialog(input_dialog, "Load file:", + filename, &filename, XtGrabExclusive) == Okay) { + if (BWReadFile(bitmap_widget, filename, NULL) != BitmapSuccess) { + sprintf(message, "Can't read file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryLoad; + } + else { + BWChangeNotify(bitmap_widget, NULL, NULL); + BWClearChanged(bitmap_widget); + FixStatus(); + } + } +} + +void DoInsert() +{ + BWGetFilepath(bitmap_widget, &filename); + RetryInsert: + if (PopupDialog(input_dialog, "Insert file:", + filename, &filename, XtGrabExclusive) == Okay) { + if (BWStoreFile(bitmap_widget, filename, NULL) != BitmapSuccess) { + sprintf(message, "Can't read file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryInsert; + } + else { + BWEngageRequest(bitmap_widget, RestoreRequest, False, Plain); + } + } +} + +void DoSave() +{ + BWGetFilename(bitmap_widget, &filename); + if (!strcmp(filename, "")) + DoSaveAs(); + else if (BWWriteFile(bitmap_widget, NULL, NULL) != BitmapSuccess) { + sprintf(message, "Can't write file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + DoSaveAs(); + } + else { + BWClearChanged(bitmap_widget); + } +} + +void DoSaveAs() +{ + BWGetFilename(bitmap_widget, &filename); + RetrySave: + if (PopupDialog(input_dialog, "Save file:", + filename, &filename, XtGrabExclusive) == Okay) { + if (BWWriteFile(bitmap_widget, filename, NULL) != BitmapSuccess) { + sprintf(message, "Can't write file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetrySave; + } + else { + BWClearChanged(bitmap_widget); + FixStatus(); + } + } +} + +void DoResize() +{ + Dimension width, height; + format = ""; + RetryResize: + if (PopupDialog(input_dialog, "Resize to WIDTHxHEIGHT:", + format, &format, XtGrabExclusive) == Okay) { + if (BWParseSize(format, &width, &height)) { + BWResize(bitmap_widget, width, height); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + FixStatus(); + } + else { + sprintf(message, "Wrong format: %s", format); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryResize; + } + } +} + +void DoRescale() +{ + Dimension width, height; + + format = ""; + RetryRescale: + if (PopupDialog(input_dialog, "Rescale to WIDTHxHEIGHT:", + format, &format, XtGrabExclusive) == Okay) { + if (BWParseSize(format, &width, &height)) { + BWRescale(bitmap_widget, width, height); + BWChangeNotify(bitmap_widget, NULL, NULL); + BWSetChanged(bitmap_widget); + FixStatus(); + } + else { + sprintf(message, "Wrong format: %s", format); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryRescale; + } + } +} + +void DoFilename() +{ + BWGetFilename(bitmap_widget, &filename); + if (PopupDialog(input_dialog, "Change filename:", + filename, &filename, XtGrabExclusive) == Okay) { + BWChangeFilename(bitmap_widget, filename); + FixStatus(); + } +} + +void DoBasename() +{ + BWGetBasename(bitmap_widget, &base_name); + if (PopupDialog(input_dialog, "Change basename:", + base_name, &base_name, XtGrabExclusive) == Okay) { + BWChangeBasename(bitmap_widget, base_name); + FixStatus(); + } +} + +void DoQuit(w, event, params, num_params) /* ARGSUSED */ + Widget w; + XEvent *event; + String *params; + Cardinal *num_params; +{ + if (BWQueryChanged(bitmap_widget)) { + BWGetFilename(bitmap_widget, &filename); + RetryQuit: + switch (PopupDialog(qsave_dialog, "Save file before quitting?", + filename, &filename, XtGrabExclusive)) { + case Yes: + if (BWWriteFile(bitmap_widget, filename, NULL) + != BitmapSuccess) { + sprintf(message, "Can't write file: %s", filename); + if (PopupDialog(error_dialog, message, + NULL, NULL, XtGrabExclusive) == Retry) + goto RetryQuit; + else return; + } + break; + + case Cancel: + return; + } + } + exit(0); +} + +void main(argc, argv) + int argc; + char *argv[]; +{ + int i, n; + Arg wargs[2]; + Widget w; + Widget radio_group; XtPointer radio_data; + + top_widget = XtInitialize(NULL, "Bitmap", + options, XtNumber(options), &argc, argv); + + if (argc > 2) { + fprintf(stderr, usage); + exit (0); + } + + check_mark = XCreateBitmapFromData(XtDisplay(top_widget), + RootWindowOfScreen(XtScreen(top_widget)), + (char *) xlogo16_bits, + xlogo16_width, + xlogo16_height); + + XtAddActions(actions_table, XtNumber(actions_table)); + XtOverrideTranslations + (top_widget, + XtParseTranslationTable("<Message>WM_PROTOCOLS: do-quit()")); + + parent_widget = XtCreateManagedWidget("parent", panedWidgetClass, + top_widget, NULL, 0); + + formy_widget = XtCreateManagedWidget("formy", formWidgetClass, + parent_widget, NULL, 0); + + fileMenu_widget = XtCreatePopupShell("fileMenu", + simpleMenuWidgetClass, + formy_widget, NULL, 0); + + fileButton_widget = XtCreateManagedWidget("fileButton", + menuButtonWidgetClass, + formy_widget, NULL, 0); + for (i = 0; i < XtNumber(file_menu); i++) { + w = XtCreateManagedWidget(file_menu[i].name, + (file_menu[i].trap ? + smeBSBObjectClass : smeLineObjectClass), + fileMenu_widget, NULL, 0), + XtAddCallback(w, + XtNcallback, + TheCallback, + (XtPointer)&file_menu[i].id); + + file_menu[i].widget = w; + } + + editMenu_widget = XtCreatePopupShell("editMenu", + simpleMenuWidgetClass, + formy_widget, NULL, 0); + + editButton_widget = XtCreateManagedWidget("editButton", + menuButtonWidgetClass, + formy_widget, NULL, 0); + + for (i = 0; i < XtNumber(edit_menu); i++) { + w = XtCreateManagedWidget(edit_menu[i].name, + (edit_menu[i].trap ? + smeBSBObjectClass : smeLineObjectClass), + editMenu_widget, NULL, 0), + XtAddCallback(w, + XtNcallback, + TheCallback, + (XtPointer)&edit_menu[i].id); + + edit_menu[i].widget = w; + } + + status_widget = XtCreateManagedWidget("status", labelWidgetClass, + formy_widget, NULL, 0); + + pane_widget = XtCreateManagedWidget("pane", panedWidgetClass, + parent_widget, NULL, 0); + + form_widget = XtCreateManagedWidget("form", formWidgetClass, + pane_widget, NULL, 0); + + for (i = 0; i < XtNumber(buttons); i++) { + w = XtCreateManagedWidget(buttons[i].name, + (buttons[i].trap ? + toggleWidgetClass : commandWidgetClass), + form_widget, NULL, 0); + + XtAddCallback(w, + XtNcallback, + TheCallback, + (XtPointer)&buttons[i].id); + + buttons[i].widget = w; + + if (buttons[i].id == Point) { + radio_group = buttons[i].widget; + radio_data = buttons[i].name; + } + } + bitmap_widget = XtCreateManagedWidget("bitmap", bitmapWidgetClass, + pane_widget, NULL, 0); + XtRealizeWidget(top_widget); + if (argc > 1) + if (BWReadFile(bitmap_widget, argv[1], NULL)) + + wm_delete_window = XInternAtom(XtDisplay(top_widget), "WM_DELETE_WINDOW", + False); + (void) XSetWMProtocols (XtDisplay(top_widget), XtWindow(top_widget), + &wm_delete_window, 1); + + + image_shell = XtCreatePopupShell("image", transientShellWidgetClass, + top_widget, NULL, 0); + + box_widget = XtCreateManagedWidget("box", boxWidgetClass, + image_shell, NULL, 0); + + normal_image_widget = XtCreateManagedWidget("normalImage", + labelWidgetClass, + box_widget, NULL, 0); + + inverted_image_widget = XtCreateManagedWidget("invertedImage", + labelWidgetClass, + box_widget, NULL, 0); + + n=0; + XtSetArg(wargs[n], XtNbitmap, BWGetUnzoomedPixmap(bitmap_widget)); n++; + XtSetValues(normal_image_widget, wargs, n); + XtSetValues(inverted_image_widget, wargs, n); + + XtRealizeWidget(image_shell); + + BWNotify(bitmap_widget, FixUp); + + FixStatus(); + + input_dialog = CreateDialog(top_widget, "input", Okay | Cancel); + error_dialog = CreateDialog(top_widget, "error", Abort | Retry); + qsave_dialog = CreateDialog(top_widget, "qsave", Yes | No | Cancel); + + XawToggleSetCurrent(radio_group, radio_data); + BWEngageRequest(bitmap_widget, PointRequest, True, Plain); + + XtMainLoop(); +} |