diff anagram/vaclgui/statwin.cpp @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/vaclgui/statwin.cpp	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,205 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1997-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * scon.cpp
+ */
+
+#include <ifont.hpp>
+
+#include "data.h"
+#include "dict.h"
+#include "dspar.hpp"
+#include "error.h"
+#include "statwin.hpp"
+#include "p.h"
+#include "pgg24-defs.h"
+#include "pgg24.h"
+#include "q1glbl.h"
+#include "q5.h"
+
+//#define INCLUDE_LOGGING
+#include "log.h"
+
+
+static int nparts;
+static int errorCount;
+
+static int sconConstructorCalls = 0;
+static int sconDestructorCalls = 0;
+
+
+StatisticsWindow::Parameter StatisticsWindow::parameter[8] = {
+  {"Lines scanned",     &pgcb.line},
+  {"Tokens identified", (int *)&ntkns},
+  {"Rules identified",  (int *)&nforms},
+  {"Partition sets",    (int *)&nparts},
+  {"States defined",    (int *)&nits},
+  {"States analyzed",   (int *)&kits},
+  {"Conflicts",         (int *)&n_conflicts},
+  {"Warnings",          (int *)&errorCount},
+};
+
+Boolean StatisticsWindow::paintWindow(IPaintEvent &event) {
+  LOGSECTION("StatisticsWindow::paintWindow");
+  LOGV((int) this) LCV(event.rect().asString());
+  event.clearBackground(ColorSpec::data.bg());
+  return false;
+}
+
+IStaticText *StatisticsWindow::statisticsField(IWindow *owner) {
+  IStaticText *field = new IStaticText(nextChildId(), owner, owner);
+  field->setAlignment(IStaticText::centerLeft);
+  field->setFont(FontSpec::dataTable);
+  field->setBackgroundColor(ColorSpec::data.bg());
+  field->setForegroundColor(ColorSpec::data.fg());
+  return field;
+}
+
+void StatisticsWindow::resize() {
+  LOGSECTION("StatisticsWindow::resize");
+  IFont f = FontSpec::dataTable;
+  int nameWidth = f.textWidth("Tokens Identified");
+  int height = f.maxSize().height();
+  int valueWidth = f.textWidth("00000");
+  LOGV(height) LCV(nameWidth) LCV(valueWidth);
+  ISize nameSize(nameWidth, height);
+  ISize valueSize(valueWidth, height);
+  int i;
+  for (i = 0; i < nLines; i++) {
+    line[i].name->setMinimumSize(nameSize);
+    line[i].value->setMinimumSize(valueSize);
+  }
+  ISize frameSize = frameRectFor(clientArea.minimumSize()).size();
+  LOGV(frameSize.asString());
+  sizeTo(frameSize);
+}
+
+void StatisticsWindow::onColorChange() {
+  setBackgroundColor(ColorSpec::data.bg());
+  int i;
+  for (i = 0; i < nLines; i++) {
+    line[i].name->setBackgroundColor(ColorSpec::data.bg());
+    line[i].name->setForegroundColor(ColorSpec::data.fg());
+    line[i].value->setBackgroundColor(ColorSpec::data.bg());
+    line[i].value->setForegroundColor(ColorSpec::data.fg());
+  }
+  refresh();
+}
+
+void StatisticsWindow::onFontChange() {
+  LOGSECTION("StatisticsWindow::onFontChange");
+  int i;
+  for (i = 0; i < nLines; i++) {
+    line[i].name->setFont(FontSpec::dataTable);
+    line[i].value->setFont(FontSpec::dataTable);
+  }
+  IFont f = FontSpec::dataTable;
+  int margin = f.avgCharWidth();
+  clientArea.setColumnWidth(1,margin);
+  clientArea.setColumnWidth(4,3*margin);
+  clientArea.setColumnWidth(7,margin);
+  clientArea.setRowHeight(1, margin);
+  clientArea.setRowHeight(6, margin);
+  resize();
+  refresh();
+}
+
+StatisticsWindow::~StatisticsWindow() {
+  LOGSECTION("StatisticsWindow::~StatisticsWindow");
+  IPaintHandler::stopHandlingEventsFor(&clientArea);
+  LOGS("Handler detached") LCV((int) this);
+  int i;
+  for (i = 0; i < nLines; i++) {
+    LOGS("Delete nameDemon") LCV((int) this);
+    delete nameDemon[i];
+    delete line[i].name;
+    LOGS("Delete valueDemon") LCV((int) this);
+    delete valueDemon[i];
+    delete line[i].value;
+    LOGS("Demons deleted") LCV(i);
+  }
+  sconDestructorCalls++;
+}
+
+StatisticsWindow::StatisticsWindow()
+  : AgFrame(IFrameWindow::dialogBorder
+            | dialogBackground
+            | IFrameWindow::systemMenu)
+  , clientArea(nextChildId(), this, this, IRectangle(),
+	       IMultiCellCanvas::classDefaultStyle | IWindow::clipChildren)
+  , dataColorChange(this, onColorChange)
+  , fontChange(this, onFontChange)
+  , helpDemon(&clientArea, "Statistical Summary")
+{
+  LOGSECTION("StatisticsWindow::StatisticsWindow");
+
+  IPaintHandler::handleEventsFor(&clientArea);
+  setClient(&clientArea);
+  char buf[1000];
+  sprintf(buf, "AnaGram : %s", simple_file_name.pointer());
+  windowTitle.setObjectText(buf);
+  windowTitle.setViewText("Statistical Summary");
+  registerTitle("Statistical Summary");
+  syntaxDependent = 1;
+  helpCursorSupported = 1;
+  dataColorChange.attach(&ColorSpec::data);
+  fontChange.attach(&FontSpec::dataTable);
+
+  setBackgroundColor(ColorSpec::data.bg());
+
+  IFont f = FontSpec::dataTable;
+  int margin = f.avgCharWidth();
+  int i;
+  for (i = 0; i < nLines; i++) {
+    line[i].name = statisticsField(&clientArea);
+    line[i].name->setAlignment(IStaticText::centerLeft);
+    line[i].name->setText(parameter[i].name);
+
+    line[i].value = statisticsField(&clientArea);
+    line[i].value->setAlignment(IStaticText::centerRight);
+    char buf[100];
+    sprintf(buf, "%d", *parameter[i].value);
+    line[i].value->setText(buf);
+    nameDemon[i] = new HelpDemon(line[i].name, "Statistical Summary");
+    valueDemon[i] = new HelpDemon(line[i].value, "Statistical Summary");
+  }
+  int j;
+  for (i = 0, j = 2; i < nLines/2; i++, j++) {
+    clientArea.addToCell(line[i].name, 2,j);
+    clientArea.addToCell(line[i].value,3,j);
+  }
+  for (j = 2; i < nLines; i++, j++) {
+    clientArea.addToCell(line[i].name, 5,j);
+    clientArea.addToCell(line[i].value,6,j);
+  }
+  clientArea.setColumnWidth(1,margin);
+  clientArea.setColumnWidth(4,3*margin);
+  clientArea.setColumnWidth(7,margin);
+  clientArea.setRowHeight(1, margin);
+  clientArea.setRowHeight(6, margin);
+  resize();
+  sconConstructorCalls++;
+}
+
+int StatisticsWindow::updateDisplay() {
+  LOGSECTION("StatisticsWindow::updateDisplay");
+  nparts = part_dict->nsx - 1;
+  errorCount = errorList.size();
+  int changeFlag = 0;
+  int i;
+  for (i = 0; i < nLines; i++) {
+    char buf[100];
+    sprintf(buf, "%d", *parameter[i].value);
+    if (line[i].value->text() == buf) {
+      continue;
+    }
+    LOGSECTION("Update value");
+    IString oldText = line[i].value->text();
+    line[i].value->setText(buf);
+    changeFlag = 1;
+  }
+  return changeFlag;
+}
+