Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

sxy_task_adjaxis.cpp

Go to the documentation of this file.
00001 // =======================================================================
00002 
00003 char *task_adjaxis_cpp = "$Id: sxy_task_adjaxis.cpp,v 1.2 2003/04/07 16:56:29 clinio Exp $";
00004 
00005 // =======================================================================
00006 
00007 #include <assert.h>
00008 #include <iup.h>
00009 #include <iupgc.h>
00010 #include <cd.h>
00011 #include <xy.h>
00012 
00013 #include "sxy_chart.h"
00014 #include "sxy_graph.h"
00015 #include "sxy_task.h"
00016 #include "sxy_task_adjaxis.h"
00017 
00018 
00019 #define HIDDEN_GRAPH "HIDDEN_GRAPH"
00020 #define HIDDEN_AXIS  "HIDDEN_AXIS"
00021 #define NO_COLOR ((long int)(0xFFFFFFFF))
00022 
00023 // =======================================================================
00024 
00025 static int pick_axis( SXYAxis* ax, int x, int y );
00026 static long int get_color( long int color );
00027 
00028 // =======================================================================
00029 
00030 static int cb_title_end_rotated( Ihandle* h ) {
00031    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00032    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00033    axis->setTitleStyle(AT_END_ROTATED);
00034    graph->redrawGraph();
00035    return IUP_DEFAULT;
00036 }
00037 
00038 // ......................................................................
00039 
00040 static int cb_scale_color( Ihandle* h ) {
00041    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00042    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00043 
00044    long int color = axis->getScaleColor();
00045    color = get_color( color );
00046    if ( color != NO_COLOR ) {
00047       axis->setScaleColor(color);
00048       graph->redrawGraph();
00049    }
00050    return IUP_DEFAULT;
00051 }
00052 
00053 // ......................................................................
00054 
00055 static int cb_title_color( Ihandle* h ) {
00056    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00057    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00058 
00059    long int color = axis->getTitleColor();
00060    color = get_color( color );
00061    if ( color != NO_COLOR ) {
00062       axis->setTitleColor(color);
00063       graph->redrawGraph();
00064    }
00065    return IUP_DEFAULT;
00066 }
00067 
00068 // ......................................................................
00069 
00070 static int cb_axis_color( Ihandle* h ) {
00071    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00072    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00073 
00074    long int color = axis->getColor();
00075    color = get_color( color );
00076    if ( color != NO_COLOR ) {
00077       axis->setColor(color);
00078       graph->redrawGraph();
00079    }
00080    return IUP_DEFAULT;
00081 }
00082 
00083 // ......................................................................
00084 
00085 static int cb_title_end( Ihandle* h ) {
00086    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00087    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00088    axis->setTitleStyle(AT_END);
00089    graph->redrawGraph();
00090    return IUP_DEFAULT;
00091 }
00092 
00093 // ......................................................................
00094 
00095 static int cb_title_middle( Ihandle* h ) {
00096    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00097    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00098    axis->setTitleStyle(AT_MIDDLE);
00099    graph->redrawGraph();
00100    return IUP_DEFAULT;
00101 }
00102 
00103 // ......................................................................
00104 //
00105 static int cb_scale_aligned( Ihandle* h ) {
00106    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00107    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00108    axis->setScaleOrientation(ALIGNED);
00109    graph->redrawGraph();
00110    return IUP_DEFAULT;
00111 }
00112 
00113 // ......................................................................
00114 
00115 static int cb_scale_rotated( Ihandle* h ) {
00116    SXYGraph* graph = (SXYGraph*)IupGetAttribute(h, HIDDEN_GRAPH);
00117    SXYAxis* axis = (SXYAxis*)IupGetAttribute(h, HIDDEN_AXIS);
00118    axis->setScaleOrientation(ROTATED);
00119    graph->redrawGraph();
00120    return IUP_DEFAULT;
00121 }
00122 
00123 // =======================================================================
00124 
00125 // ......................................................................
00126 
00127 static int pick_axis( SXYAxis* ax, int x, int y ) {
00128   XYAxis* xy_ax = ax->getXyAxis();
00129   XYRasterText* xy_tit = ax->getXyTitle();
00130   XYRasterText* xy_dec = ax->getXyDecorator();
00131   if ( xy_ax->pick(x,y) == xytrue || xy_tit->pick(x,y) == xytrue ||
00132        xy_dec->pick(x,y) == xytrue ) 
00133        return 1;
00134   return 0;
00135 }
00136 
00137 // ......................................................................
00138 
00139 static long int get_color( long int color ) {
00140    unsigned char r, g, b;
00141    r = (color & 0xFF0000) >> 16;
00142    g = (color & 0x00FF00) >> 8;
00143    b = (color & 0x0000FF);
00144    int answer = IupGetColor (IUP_CENTER, IUP_CENTER, &r, &g, &b);
00145    if (answer == 1) color = r << 16 | g << 8 | b;
00146    else color = NO_COLOR;
00147    return color;
00148 }
00149 
00150 // ......................................................................
00151 
00152 // =======================================================================
00153 
00154 SXYTaskReturn SXYTaskAdjustAxis::mouseClick(SXYGraph* graph, int b, int x, int y, 
00155 int sft, int ctr) {
00156    if ( b != 3 ) return CALLBACK_NOT_TREATED;
00157    int cht = graph->getChartOfEvent(x, y);
00158    if (cht < 0) return CALLBACK_NOT_TREATED;
00159 
00160    SXYChart* chart = graph->getChart(cht);
00161    if (chart == NULL) return CALLBACK_NOT_TREATED;
00162 
00163    int nhaxes = chart->getNumAxes(HORIZONTAL_AXIS);
00164    for( int ha = 0; ha < nhaxes; ha++ ) {
00165       SXYAxis* ax = chart->getAxis(HORIZONTAL_AXIS, ha);
00166       if ( pick_axis(ax,x,y) ) return openMenu(graph,ax);
00167    }
00168    int nvaxes = chart->getNumAxes(VERTICAL_AXIS);
00169    for( int va = 0; va < nvaxes; va++ ) {
00170       SXYAxis* ax = chart->getAxis(VERTICAL_AXIS, va);
00171       if ( pick_axis(ax,x,y) ) return openMenu(graph,ax);
00172    }
00173 
00174    return CALLBACK_NOT_TREATED;
00175 }
00176 
00177 // ......................................................................
00178 
00179 SXYTaskReturn SXYTaskAdjustAxis::openMenu(SXYGraph* graph, SXYAxis* ax) {
00180    int language = ( !strcmp( IupGetLanguage(), IUP_ENGLISH ) ) ? 1 : 0;
00181 
00182    char* scales_strings[][64] = {
00183       { "Alinhada com o eixo", "Ortogonal ao eixo" },
00184       { "Aligned to axis", "Orthogonal to axis" }
00185    };
00186    Ihandle* scale_aligned_item = IupItem( 
00187          scales_strings[language][0], "cb_scale_aligned" );
00188    Ihandle* scale_rotated_item = IupItem( 
00189          scales_strings[language][1], "cb_scale_rotated" );
00190 
00191    IupSetAttribute(scale_aligned_item, HIDDEN_AXIS, (char*)ax);
00192    IupSetAttribute(scale_aligned_item, HIDDEN_GRAPH, (char*)graph);
00193    IupSetAttribute(scale_rotated_item, HIDDEN_AXIS, (char*)ax);
00194    IupSetAttribute(scale_rotated_item, HIDDEN_GRAPH, (char*)graph);
00195    if (ax->getScaleOrientation() == ALIGNED )
00196       IupSetAttribute(scale_aligned_item, IUP_VALUE, IUP_ON);
00197    else
00198       IupSetAttribute(scale_rotated_item, IUP_VALUE, IUP_ON);
00199 
00200    char* title_strings[][64] = {
00201       { "Na extremidade", "Na extremidade e rotacionada", "No centro" },
00202       { "At edge", "At edge and rotated", "centralized" }
00203    };
00204    Ihandle* title_end_item = IupItem( title_strings[language][0], 
00205          "cb_title_end" );
00206    Ihandle* title_end_rotated_item = IupItem( title_strings[language][1], 
00207          "cb_title_end_rotated" );
00208    Ihandle* title_middle_item = IupItem( title_strings[language][2], 
00209          "cb_title_middle" );
00210 
00211    IupSetAttribute(title_end_item, HIDDEN_AXIS, (char*)ax);
00212    IupSetAttribute(title_end_item, HIDDEN_GRAPH, (char*)graph);
00213    IupSetAttribute(title_end_rotated_item, HIDDEN_AXIS, (char*)ax);
00214    IupSetAttribute(title_end_rotated_item, HIDDEN_GRAPH, (char*)graph);
00215    IupSetAttribute(title_middle_item, HIDDEN_AXIS, (char*)ax);
00216    IupSetAttribute(title_middle_item, HIDDEN_GRAPH, (char*)graph);
00217 
00218    SXYAxisTitleStyle sty = ax->getTitleStyle();
00219    if ( sty == AT_MIDDLE )
00220       IupSetAttribute(title_middle_item, IUP_VALUE, IUP_ON);
00221    else if ( sty == AT_END )
00222       IupSetAttribute(title_end_item, IUP_VALUE, IUP_ON);
00223    else if ( sty == AT_END_ROTATED )
00224       IupSetAttribute(title_end_rotated_item, IUP_VALUE, IUP_ON);
00225 
00226    char* item_strings[][64] = {
00227       { "Escala", "Título", "Eixo" },
00228       { "Scale", "Title", "SXYAxis" }
00229    };
00230    Ihandle* scale_color_item = IupItem( item_strings[language][0], 
00231          "cb_scale_color" );
00232    Ihandle* title_color_item = IupItem( item_strings[language][1], 
00233          "cb_title_color" );
00234    Ihandle* axis_color_item = IupItem( item_strings[language][2], 
00235          "cb_axis_color" );
00236 
00237    IupSetAttribute(axis_color_item, HIDDEN_AXIS, (char*)ax);
00238    IupSetAttribute(axis_color_item, HIDDEN_GRAPH, (char*)graph);
00239    IupSetAttribute(title_color_item, HIDDEN_AXIS, (char*)ax);
00240    IupSetAttribute(title_color_item, HIDDEN_GRAPH, (char*)graph);
00241    IupSetAttribute(scale_color_item, HIDDEN_AXIS, (char*)ax);
00242    IupSetAttribute(scale_color_item, HIDDEN_GRAPH, (char*)graph);
00243 
00244    // Menus de opções
00245    Ihandle* scale_menu = IupMenu( scale_aligned_item, 
00246          scale_rotated_item, NULL );
00247    Ihandle* title_menu = IupMenu( title_end_item, 
00248          title_end_rotated_item, title_middle_item, NULL );
00249    Ihandle* color_menu = IupMenu( axis_color_item, 
00250          title_color_item, scale_color_item, NULL );
00251 
00252    // Submenus a serem exibidos
00253    char* submenu_strings[][64] = {
00254       { "Orientar a escala", "Posicionar o título", "Definir cores" },
00255       { "Scale orientation", "title position", "Colors" }
00256    };
00257    Ihandle* scale_submenu = IupSubmenu( 
00258          submenu_strings[language][0], scale_menu );
00259    Ihandle* title_submenu = IupSubmenu( 
00260          submenu_strings[language][1], title_menu );
00261    Ihandle* color_submenu = IupSubmenu( 
00262          submenu_strings[language][2], color_menu );
00263 
00264    // Ajuste das callbacks
00265    IupSetFunction( "cb_scale_aligned", (Icallback)cb_scale_aligned );
00266    IupSetFunction( "cb_scale_rotated", (Icallback)cb_scale_rotated );
00267 
00268    IupSetFunction( "cb_axis_color", (Icallback)cb_axis_color );
00269    IupSetFunction( "cb_title_color", (Icallback)cb_title_color );
00270    IupSetFunction( "cb_scale_color", (Icallback)cb_scale_color );
00271 
00272    IupSetFunction( "cb_title_middle", (Icallback)cb_title_middle );
00273    IupSetFunction( "cb_title_end", (Icallback)cb_title_end );
00274    IupSetFunction( "cb_title_end_rotated", (Icallback)cb_title_end_rotated );
00275 
00276    // Menu principal
00277    Ihandle* menu = IupMenu(color_submenu, scale_submenu, title_submenu, NULL);
00278    IupPopup(menu, IUP_MOUSEPOS, IUP_MOUSEPOS);
00279    IupDestroy(menu);
00280 
00281    return CALLBACK_TREATED;
00282 }
00283 
00284 // ......................................................................
00285 
00286 SXYTaskAdjustAxis::SXYTaskAdjustAxis(void) {
00287 }
00288 
00289 // ......................................................................
00290 
00291 SXYTaskAdjustAxis::~SXYTaskAdjustAxis() {
00292 }
00293 
00294 // ......................................................................
00295 
00296 SXYTaskReturn SXYTaskAdjustAxis::mouseUnclick(SXYGraph* graph, int b, int x, int y,
00297 int sft, int ctr) {
00298    return CALLBACK_NOT_TREATED;
00299 }
00300 // ......................................................................
00301 
00302 SXYTaskReturn SXYTaskAdjustAxis::mouseMotion(SXYGraph* graph, int x, int y,
00303 int sft, int ctr) {
00304    return CALLBACK_NOT_TREATED;
00305 }
00306         
00307 // ......................................................................
00308 
00309 SXYTaskReturn SXYTaskAdjustAxis::mouseEnter(SXYGraph* graph) {
00310    return CALLBACK_NOT_TREATED;
00311 }
00312 
00313 // ......................................................................
00314 
00315 SXYTaskReturn SXYTaskAdjustAxis::mouseLeave(SXYGraph* graph) {
00316    return CALLBACK_NOT_TREATED;
00317 }
00318 

SXY
Tecgraf / PUC-Rio - Computer Graphics Technology Group