summaryrefslogtreecommitdiff
path: root/app/wlib/gtklib/gtksimple.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib/gtklib/gtksimple.c')
-rw-r--r--app/wlib/gtklib/gtksimple.c366
1 files changed, 366 insertions, 0 deletions
diff --git a/app/wlib/gtklib/gtksimple.c b/app/wlib/gtklib/gtksimple.c
new file mode 100644
index 0000000..244c0a3
--- /dev/null
+++ b/app/wlib/gtklib/gtksimple.c
@@ -0,0 +1,366 @@
+/*
+ * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/wlib/gtklib/gtksimple.c,v 1.6 2009-09-25 05:38:15 dspagnol Exp $
+ */
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2005 Dave Bullis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+
+#include "gtkint.h"
+
+static int windowxxx = 0;
+/*
+ *****************************************************************************
+ *
+ * Message Boxes
+ *
+ *****************************************************************************
+ */
+
+struct wMessage_t {
+ WOBJ_COMMON
+ GtkWidget * labelWidget;
+ const char * message;
+ wPos_t labelWidth;
+ };
+
+EXPORT void wMessageSetValue(
+ wMessage_p b,
+ const char * arg )
+{
+ if (b->widget == 0) abort();
+ gtk_label_set( GTK_LABEL( b->labelWidget ), gtkConvertInput(arg) );
+}
+
+
+EXPORT void wMessageSetWidth(
+ wMessage_p b,
+ wPos_t width )
+{
+ b->labelWidth = width;
+#ifndef GTK1
+ gtk_widget_set_size_request( b->widget, width, -1 );
+#else
+ gtk_widget_set_usize( b->widget, width, -1 );
+#endif
+}
+
+
+EXPORT wPos_t wMessageGetHeight(
+ long flags )
+{
+ return 14;
+}
+
+/**
+ * Create a window for a simple text.
+ *
+ * \param IN parent Handle of parent window
+ * \param IN x position in x direction
+ * \param IN y position in y direction
+ * \param IN labelStr ???
+ * \param IN width horizontal size of window
+ * \param IN message message to display ( null terminated )
+ * \param IN flags display options
+ * \return handle for created window
+ */
+
+EXPORT wMessage_p wMessageCreateEx(
+ wWin_p parent,
+ wPos_t x,
+ wPos_t y,
+ const char * labelStr,
+ wPos_t width,
+ const char *message,
+ long flags )
+{
+ wMessage_p b;
+ GtkRequisition requisition;
+ PangoFontDescription *fontDesc;
+ int fontSize;
+
+ b = (wMessage_p)gtkAlloc( parent, B_MESSAGE, x, y, NULL, sizeof *b, NULL );
+ gtkComputePos( (wControl_p)b );
+ b->message = message;
+ b->labelWidth = width;
+
+ b->labelWidget = gtk_label_new( message?gtkConvertInput(message):"" );
+
+ /* do we need to set a special font? */
+ if( wMessageSetFont( flags )) {
+ /* get the current font descriptor */
+ fontDesc = (b->labelWidget)->style->font_desc;
+
+ /* get the current font size */
+ fontSize = PANGO_PIXELS(pango_font_description_get_size( fontDesc ));
+
+ /* calculate the new font size */
+ if( flags & BM_LARGE ) {
+ pango_font_description_set_size( fontDesc, fontSize * 1.4 * PANGO_SCALE );
+ } else {
+ pango_font_description_set_size( fontDesc, fontSize * 0.7 * PANGO_SCALE );
+ }
+
+ /* set the new font size */
+ gtk_widget_modify_font( (GtkWidget *)b->labelWidget, fontDesc );
+ }
+
+ b->widget = gtk_fixed_new();
+ gtk_widget_size_request( GTK_WIDGET(b->labelWidget), &requisition );
+ gtk_container_add( GTK_CONTAINER(b->widget), b->labelWidget );
+
+ gtk_widget_set_size_request( b->widget, width?width:requisition.width, requisition.height );
+ gtkControlGetSize( (wControl_p)b );
+ gtk_fixed_put( GTK_FIXED(parent->widget), b->widget, b->realX, b->realY );
+
+ gtk_widget_show( b->widget );
+ gtk_widget_show( b->labelWidget );
+ gtkAddButton( (wControl_p)b );
+
+ /* Reset font size to normal */
+ if( wMessageSetFont( flags )) {
+ if( flags & BM_LARGE ) {
+ pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
+ } else {
+ pango_font_description_set_size(fontDesc, fontSize * PANGO_SCALE);
+ }
+ }
+ return b;
+}
+
+/*
+ *****************************************************************************
+ *
+ * Lines
+ *
+ *****************************************************************************
+ */
+
+struct wLine_t {
+ WOBJ_COMMON
+ wBool_t visible;
+ int count;
+ wLines_t * lines;
+ };
+
+static void linesRepaint( wControl_p b )
+{
+ wLine_p bl = (wLine_p)(b);
+ int i;
+ wWin_p win = (wWin_p)(bl->parent);
+ GdkDrawable * window;
+ GdkColor *black;
+
+ if (!bl->visible)
+ return;
+if (windowxxx)
+ window = win->gtkwin->window;
+else
+ window = win->widget->window;
+
+ /* get the GC attached to the panel in main() */
+ black = gtkGetColor( wDrawColorBlack, TRUE );
+ gdk_gc_set_foreground( win->gc, black );
+ gdk_gc_set_function( win->gc, GDK_COPY );
+ for (i=0; i<bl->count; i++) {
+ if (win->gc_linewidth != bl->lines[i].width) {
+ win->gc_linewidth = bl->lines[i].width;
+ gdk_gc_set_line_attributes( win->gc, win->gc_linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER );
+ }
+ gdk_draw_line( window, win->gc,
+ bl->lines[i].x0, bl->lines[i].y0,
+ bl->lines[i].x1, bl->lines[i].y1 );
+ }
+}
+
+
+void gtkLineShow(
+ wLine_p bl,
+ wBool_t visible )
+{
+ bl->visible = visible;
+}
+
+
+wLine_p wLineCreate(
+ wWin_p parent,
+ const char * labelStr,
+ int count,
+ wLines_t * lines )
+{
+ wLine_p b;
+ int i;
+ b = (wLine_p)gtkAlloc( parent, B_LINES, 0, 0, labelStr, sizeof *b, NULL );
+ if (parent->gc == NULL) {
+ parent->gc = gdk_gc_new( parent->gtkwin->window );
+ gdk_gc_copy( parent->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] );
+ parent->gc_linewidth = 0;
+ gdk_gc_set_line_attributes( parent->gc, parent->gc_linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER );
+ }
+ b->visible = TRUE;
+ b->count = count;
+ b->lines = lines;
+
+ b->w = b->h = 0;
+ for ( i=0; i<count; i++ ) {
+ if (lines[i].x0 > b->w)
+ b->w = lines[i].x0;
+ if (lines[i].y0 > b->h)
+ b->h = lines[i].y0;
+ if (lines[i].x1 > b->w)
+ b->w = lines[i].x1;
+ if (lines[i].y1 > b->h)
+ b->h = lines[i].y1;
+ }
+ b->repaintProc = linesRepaint;
+ gtkAddButton( (wControl_p)b );
+ b->widget = 0;
+ return b;
+}
+
+
+/*
+ *****************************************************************************
+ *
+ * Boxes
+ *
+ *****************************************************************************
+ */
+
+struct wBox_t {
+ WOBJ_COMMON
+ wBoxType_e boxTyp;
+ };
+
+#define B (1)
+#define W (2)
+#define SETCOLOR( S, N ) \
+ if ( lastColor != colors[style][S][N] ) { \
+ lastColor = colors[style][S][N]; \
+ gdk_gc_set_foreground( win->gc, (lastColor==B)?black:white ); \
+ }
+
+EXPORT void wBoxSetSize(
+ wBox_p b, /* */
+ wPos_t w, /* */
+ wPos_t h ) /* */
+{
+ b->w = w;
+ b->h = h;
+}
+
+
+EXPORT void gtkDrawBox(
+ wWin_p win,
+ wBoxType_e style,
+ wPos_t x,
+ wPos_t y,
+ wPos_t w,
+ wPos_t h )
+{
+ wPos_t x0, y0, x1, y1;
+ char lastColor;
+ GdkColor *white;
+ GdkColor *black;
+ GdkDrawable * window;
+ static char colors[8][4][2] = {
+ { /* ThinB */ {B,0}, {B,0}, {B,0}, {B,0} },
+ { /* ThinW */ {W,0}, {W,0}, {W,0}, {W,0} },
+ { /* AboveW */ {W,0}, {W,0}, {B,0}, {B,0} },
+ { /* BelowW */ {B,0}, {B,0}, {W,0}, {W,0} },
+ { /* ThickB */ {B,B}, {B,B}, {B,B}, {B,B} },
+ { /* ThickW */ {W,W}, {W,W}, {W,W}, {W,W} },
+ { /* RidgeW */ {W,B}, {W,B}, {B,W}, {B,W} },
+ { /* TroughW*/ {B,W}, {B,W}, {W,B}, {W,B} } };
+
+if (windowxxx)
+ window = win->gtkwin->window;
+else
+ window = win->widget->window;
+ white = gtkGetColor( wDrawColorWhite, TRUE );
+ black = gtkGetColor( wDrawColorBlack, TRUE );
+ win->gc_linewidth = 0;
+ gdk_gc_set_line_attributes( win->gc, 0, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER );
+ gdk_gc_set_function( win->gc, GDK_COPY );
+ x0 = x;
+ x1 = x+w;
+ y0 = y;
+ y1 = y+h;
+ lastColor = colors[style][0][0];
+ gdk_gc_set_foreground( win->gc, (lastColor==B)?black:white );
+ gdk_draw_line( window, win->gc, x0, y0, x0, y1 );
+ SETCOLOR( 1, 0 );
+ gdk_draw_line( window, win->gc, x0+1, y0, x1, y0 );
+ SETCOLOR( 2, 0 );
+ gdk_draw_line( window, win->gc, x1, y1, x0+1, y1 );
+ SETCOLOR( 3, 0 );
+ gdk_draw_line( window, win->gc, x1, y1-1, x1, y0+1 );
+ if (style < wBoxThickB)
+ return;
+ x0++; y0++; x1--; y1--;
+ SETCOLOR( 0, 1 );
+ gdk_draw_line( window, win->gc, x0, y0, x0, y1 );
+ SETCOLOR( 1, 1 );
+ gdk_draw_line( window, win->gc, x0+1, y0, x1, y0 );
+ SETCOLOR( 2, 1 );
+ gdk_draw_line( window, win->gc, x1, y1, x0+1, y1 );
+ SETCOLOR( 3, 1 );
+ gdk_draw_line( window, win->gc, x1, y1-1, x1, y0+1 );
+ gdk_gc_set_foreground( win->gc, black );
+}
+
+
+static void boxRepaint( wControl_p b )
+{
+ wBox_p bb = (wBox_p)(b);
+ wWin_p win = bb->parent;
+
+ gtkDrawBox( win, bb->boxTyp, bb->realX, bb->realY, bb->w, bb->h );
+}
+
+
+wBox_p wBoxCreate(
+ wWin_p parent,
+ wPos_t bx,
+ wPos_t by,
+ const char * labelStr,
+ wBoxType_e boxTyp,
+ wPos_t bw,
+ wPos_t bh )
+{
+ wBox_p b;
+ b = (wBox_p)gtkAlloc( parent, B_BOX, bx, by, labelStr, sizeof *b, NULL );
+ gtkComputePos( (wControl_p)b );
+ b->boxTyp = boxTyp;
+ b->w = bw;
+ b->h = bh;
+ if (parent->gc == NULL) {
+ parent->gc = gdk_gc_new( parent->gtkwin->window );
+ gdk_gc_copy( parent->gc, parent->gtkwin->style->base_gc[GTK_STATE_NORMAL] );
+ parent->gc_linewidth = 0;
+ gdk_gc_set_line_attributes( parent->gc, parent->gc_linewidth, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER );
+ }
+ b->repaintProc = boxRepaint;
+ gtkAddButton( (wControl_p)b );
+ return b;
+}
+