~ubuntu-branches/debian/squeeze/gmsh/squeeze

« back to all changes in this revision

Viewing changes to Fltk/messageWindow.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Christophe Prud'homme
  • Date: 2009-02-17 10:12:27 UTC
  • mfrom: (1.2.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20090217101227-mdrolkldak2pgd2i
Tags: 2.3.0.dfsg-1
* New upstream release
  + major graphics and GUI code refactoring; 
  + new full-quad/hexa subdivision algorithm (removed 
    Mesh.RecombineAlgo);
  + improved automatic transfinite corner selection (now also 
    for volumes); 
  + improved visibility browser; new automatic adaptive visualization
    for high-order simplices;
  + modified arrow size, clipping planes and transform options; many
    improvements and
  + bug fixes all over the place.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Gmsh - Copyright (C) 1997-2009 C. Geuzaine, J.-F. Remacle
 
2
//
 
3
// See the LICENSE.txt file for license information. Please report all
 
4
// bugs and problems to <gmsh@geuz.org>.
 
5
 
 
6
#include <string.h>
 
7
#include <FL/Fl_Box.H>
 
8
#include <FL/Fl_Return_Button.H>
 
9
#include <FL/fl_ask.H>
 
10
#include "GUI.h"
 
11
#include "messageWindow.h"
 
12
#include "paletteWindow.h"
 
13
#include "fileDialogs.h"
 
14
#include "GmshMessage.h"
 
15
#include "OS.h"
 
16
#include "Context.h"
 
17
 
 
18
extern Context_T CTX;
 
19
 
 
20
void message_cb(Fl_Widget *w, void *data)
 
21
{
 
22
  GUI::instance()->messages->show();
 
23
}
 
24
 
 
25
static void message_auto_scroll_cb(Fl_Widget *w, void *data)
 
26
{
 
27
  CTX.msg_auto_scroll = GUI::instance()->messages->butt->value();
 
28
}
 
29
 
 
30
static void message_copy_cb(Fl_Widget *w, void *data)
 
31
{
 
32
  std::string buff;
 
33
  for(int i = 1; i <= GUI::instance()->messages->browser->size(); i++) {
 
34
    if(GUI::instance()->messages->browser->selected(i)) {
 
35
      const char *c = GUI::instance()->messages->browser->text(i);
 
36
      if(c[0] == '@')
 
37
        buff += std::string(&c[5]);
 
38
      else
 
39
        buff += std::string(c);
 
40
      buff += "\n";
 
41
    }
 
42
  }
 
43
  // bof bof bof
 
44
  Fl::copy(buff.c_str(), buff.size(), 0);
 
45
  Fl::copy(buff.c_str(), buff.size(), 1);
 
46
}
 
47
 
 
48
static void message_clear_cb(Fl_Widget *w, void *data)
 
49
{
 
50
  GUI::instance()->messages->browser->clear();
 
51
}
 
52
 
 
53
static void message_save_cb(Fl_Widget *w, void *data)
 
54
{
 
55
 test:
 
56
  if(file_chooser(0, 1, "Save", "*")) {
 
57
    std::string name = file_chooser_get_name(1);
 
58
    if(CTX.confirm_overwrite) {
 
59
      if(!StatFile(name))
 
60
        if(!fl_choice("File '%s' already exists.\n\nDo you want to replace it?", 
 
61
                      "Cancel", "Replace", NULL, name.c_str()))
 
62
          goto test;
 
63
    }
 
64
    GUI::instance()->messages->save(name.c_str());
 
65
  }
 
66
}
 
67
 
 
68
messageWindow::messageWindow(int deltaFontSize)
 
69
{
 
70
  FL_NORMAL_SIZE -= deltaFontSize;
 
71
 
 
72
  int width = CTX.msg_size[0];
 
73
  int height = CTX.msg_size[1];
 
74
 
 
75
  win = new paletteWindow
 
76
    (width, height, CTX.non_modal_windows ? true : false, "Message Console");
 
77
  win->box(GMSH_WINDOW_BOX);
 
78
 
 
79
  browser = new Fl_Browser(0, 0, width, height - 2 * WB - BH);
 
80
  browser->box(FL_FLAT_BOX);
 
81
  browser->textfont(FL_COURIER);
 
82
  browser->textsize(FL_NORMAL_SIZE - 1);
 
83
  browser->type(FL_MULTI_BROWSER);
 
84
  browser->callback(message_copy_cb);
 
85
 
 
86
  {
 
87
    butt = new Fl_Check_Button
 
88
      (width - 3 * BB - 3 * WB, height - BH - WB, BB, BH, "Auto scroll");
 
89
    butt->type(FL_TOGGLE_BUTTON);
 
90
    butt->callback(message_auto_scroll_cb);
 
91
  }
 
92
  {
 
93
    Fl_Return_Button *o = new Fl_Return_Button
 
94
      (width - 2 * BB - 2 * WB, height - BH - WB, BB, BH, "Clear");
 
95
    o->callback(message_clear_cb);
 
96
  }
 
97
  {
 
98
    Fl_Button *o = new Fl_Button
 
99
      (width - BB - WB, height - BH - WB, BB, BH, "Save");
 
100
    o->callback(message_save_cb);
 
101
  }
 
102
 
 
103
  win->resizable(new Fl_Box(1, 1, 4, 4));
 
104
  win->size_range(WB + 100 + 2 * BB + 3 * WB, 100);
 
105
 
 
106
  win->position(CTX.msg_position[0], CTX.msg_position[1]);
 
107
  win->end();
 
108
 
 
109
  FL_NORMAL_SIZE += deltaFontSize;
 
110
}
 
111
 
 
112
void messageWindow::add(const char *msg)
 
113
{
 
114
  browser->add(msg, 0);
 
115
  if(CTX.msg_auto_scroll)
 
116
    browser->bottomline(browser->size());
 
117
}
 
118
 
 
119
void messageWindow::save(const char *filename)
 
120
{
 
121
  FILE *fp = fopen(filename, "w");
 
122
 
 
123
  if(!fp) {
 
124
    Msg::Error("Unable to open file '%s'", filename);
 
125
    return;
 
126
  }
 
127
 
 
128
  Msg::StatusBar(2, true, "Writing '%s'", filename);
 
129
  for(int i = 1; i <= browser->size(); i++) {
 
130
    const char *c = browser->text(i);
 
131
    if(c[0] == '@')
 
132
      fprintf(fp, "%s\n", &c[5]);
 
133
    else
 
134
      fprintf(fp, "%s\n", c);
 
135
  }
 
136
  Msg::StatusBar(2, true, "Wrote '%s'", filename);
 
137
  fclose(fp);
 
138
}
 
139
 
 
140
void messageWindow::show(bool redrawOnly)
 
141
{
 
142
  if(win->shown() && redrawOnly)
 
143
    win->redraw();
 
144
  else
 
145
    win->show();
 
146
}