#include "TCanvas.h"
#include "TH1.h"
#include "TLatex.h"
#include "TLegend.h"
#include "TLine.h"
#include "TString.h"
#include "TStyle.h"
//#include "TSystem.h"

#include "QFramework/TQGridScanner.h"
#include "QFramework/TQGridScanResults.h"
#include "QFramework/TQGridScanObservable.h"
#include "QFramework/TQGridScanStyle.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQROOTPlotter.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQLibrary.h"

using std::unique_ptr;

using BoundDirection = TQGridScanBound::Direction;

// Rebins a histogram based on the desired range (which includes step size)
// Histograms with different binning (i.e. stepSize > 1) than the input ndim hist should be
// rebinned; otherwise, nothing happens
unique_ptr<TH1F> TQGridScanStyle::rebinHist(unique_ptr<TH1F> hist, TQGridScanBound::Range range, BoundDirection direction) {
  int stepSize = range[2];
  if (stepSize > 1) {
    int lowerBin = range[0];
    int upperBin = range[1];
    int nBins = (upperBin - lowerBin) / stepSize + 1;

    // This is necessary because user-space upper bound is exclusive, but bin upper bound is
    // defined to be inclusive.
    if (direction == BoundDirection::upper) ++lowerBin;
    if (lowerBin == 0) lowerBin = 1;
    // The upper edge of the highest bin must also be stored
    double* newBins = new double[nBins + 1];
    double newMin = hist->GetXaxis()->GetBinLowEdge(lowerBin);
    double newBinSize = hist->GetXaxis()->GetBinLowEdge(lowerBin + stepSize) - newMin;
    for (auto i = 0; i < nBins + 1; ++i) {
      newBins[i] = newMin + i * newBinSize;
    }
    auto result = unique_ptr<TH1F>(dynamic_cast<TH1F*>(hist->Rebin(nBins, "", newBins)));
    delete[] newBins;
    return result;
  }
  return hist;
}

unique_ptr<TCanvas> TQGridScanStyle::defaultCanvas() {
  return unique_ptr<TCanvas>(new TCanvas("c", "c", 600, 600));
}

void TQGridScanStyle::drawLabels(TQTaggable& tags) {
  // draw some of the official atlas labels
  double textsize = tags.getTagDoubleDefault("style.textSize",0.05);
  int font = tags.getTagDoubleDefault("style.text.font",42);
  int color = tags.getTagDoubleDefault("style.text.color",1);
  double x = tags.getTagDoubleDefault("style.labels.xOffset",0.2);
  double y = tags.getTagDoubleDefault("style.labels.yPos",0.92);
  if (tags.getTagBoolDefault("style.drawATLAS",false)) {
    // draw the ATLAS label
    TLatex l;
    l.SetNDC();
    l.SetTextFont(72);
    l.SetTextSize(textsize * tags.getTagDoubleDefault("labels.drawATLAS.scale",1.25));
    l.SetTextColor(1);
    l.DrawLatex(x, y, tags.getTagStringDefault("labels.drawATLAS.text","ATLAS"));
    TString atlasLabel;
    if(tags.getTagString("labels.atlas.text",atlasLabel)) {
      // draw the ATLAS label addition
      TLatex p;
      p.SetNDC();
      p.SetTextFont(font);
      p.SetTextColor(color);
      p.SetTextSize(textsize * tags.getTagDoubleDefault("labels.atlas.scale",1.25));
      p.DrawLatex(x + tags.getTagDoubleDefault("labels.atlas.xOffset",0.16), y, atlasLabel.Data());
    }
  }
}

void TQGridScanStyle::setStyleAndRangeSignifProfile(TH1F* hist, TH1F* histmax, TQTaggable& tags) {
  hist->SetMarkerStyle(20);
  hist->SetMarkerColor(kBlack);
  hist->SetLineColor(kBlack);
  if (histmax) {
    histmax->SetMarkerStyle(21);
    histmax->SetMarkerColor(kBlue);
    histmax->SetLineColor(tags.getTagIntegerDefault("style.optimum.color",kRed));
    hist->SetMaximum(0.05*(histmax->GetMaximum() - hist->GetMinimum())+histmax->GetMaximum());
    histmax->SetMaximum(hist->GetMaximum());
    TQHistogramUtils::edge(histmax, tags.getTagDoubleDefault("profile.plotMinSignificance",0.));
  }
}

void TQGridScanStyle::setStyleInputHists(TH1F* hist_sig, TH1F* hist_bkg, TQTaggable& /*tags*/) {
  hist_sig->SetLineColor(kRed);
  hist_sig->SetLineWidth(2);
  hist_bkg->SetLineColor(kBlack);
  hist_bkg->SetLineWidth(2);
  double ymax = TQHistogramUtils::getHistogramMaximum(2, hist_sig, hist_bkg);
  hist_sig->GetYaxis()->SetRangeUser(0, ymax*3/2.);
  hist_bkg->GetYaxis()->SetRangeUser(0, ymax*3/2.);
}

void TQGridScanStyle::setStyleSignifProfileGraphs(TGraph* graph, TGraph* graphmax, TQTaggable& tags) {
  graphmax->SetLineWidth(tags.getTagDoubleDefault("profile.arrow.width", 2));
  graphmax->SetMarkerSize(tags.getTagDoubleDefault("profile.marker.size", 2));
  graphmax->SetMarkerStyle(tags.getTagDoubleDefault("profile.marker.style", 33));

  graph->SetLineWidth(tags.getTagDoubleDefault("profile.arrow.width", 2));
  graph->SetMarkerSize(tags.getTagDoubleDefault("profile.marker.size", 2));
  graph->SetMarkerStyle(27);
      
  graphmax->SetMarkerColor(tags.getTagDoubleDefault("profile.marker.color", 2));
  graphmax->SetFillColor(tags.getTagDoubleDefault("profile.marker.color", 2));
  graphmax->SetLineColor(tags.getTagDoubleDefault("profile.marker.color", 2));
      
  graph->SetMarkerColorAlpha(13, 1); // make gray
  graph->SetFillColorAlpha(13, 1);
  graph->SetLineColorAlpha(13, 1);
}

void TQGridScanStyle::setStyle(TPad* pad, TH1F* hist, TQTaggable& tags) {
  // set the style for 1D plotting
  TQROOTPlotter::setStyleAtlas();
  double xaxisLabelSize = tags.getTagDoubleDefault("style.XaxisLabelSize",0.04);
  double yaxisLabelSize = tags.getTagDoubleDefault("style.YaxisLabelSize",0.04);
  double xaxisTitleSize = tags.getTagDoubleDefault("style.XaxisTitleSize",0.04);
  double yaxisTitleSize = tags.getTagDoubleDefault("style.YaxisTitleSize",0.04);
  gStyle->SetLabelSize(xaxisLabelSize,"X");
  gStyle->SetLabelSize(yaxisLabelSize,"Y");
  gStyle->SetTitleSize(xaxisTitleSize,"X");
  gStyle->SetTitleSize(yaxisTitleSize,"Y");
  bool showTitle = tags.getTagBoolDefault("style.showTitle",true);
  if(!showTitle) {
    gStyle->SetOptTitle(false);
    // pad->SetTopMargin(0.01);
  }
  hist->UseCurrentStyle();
  pad->UseCurrentStyle();
  // histogram style
  gPad->Modified();
  gPad->Update();
  drawLabels(tags);
}

void TQGridScanStyle::drawLegend(TH1F* hist, TH1F* histmax, TQTaggable& tags, const TString& histlabel, TLine* cutline, TGraph* graph, TGraph* graphmax) {
  // draw the legend for this plot
  if(!hist && !histmax) return;
  gPad->Modified();
  gPad->Update();
  double ndc_hmargin = tags.getTagDoubleDefault("profile.legend.hmargin",0.2);
  double ndc_width = tags.getTagDoubleDefault("profile.legend.width",0.3);
  double ndc_height = tags.getTagDoubleDefault("profile.legend.height",0.3);
  double ndc_vmargin = tags.getTagDoubleDefault("profile.legend.vmargin",0.02);
  double xmax = TQHistogramUtils::getAxisXmax(hist);
  double xmin = TQHistogramUtils::getAxisXmin(hist);
  double ymax = TQHistogramUtils::getHistogramMaximum(2,hist,histmax);
  double ymin = TQHistogramUtils::getHistogramMinimum(2,hist,histmax);
  double width = ndc_width * (xmax - xmin);
  double height = ndc_height * (ymax - ymin);
  double hmargin = ndc_hmargin * (xmax - xmin);
  double hmargin_left = (ndc_hmargin-0.105) * (xmax - xmin);
  double vmargin = ndc_vmargin * (ymax - ymin);
  double left = xmin + hmargin;
  double right = xmax - hmargin;
  double bottom = ymin + vmargin;
  double top = ymax - vmargin;
  // first try: lets fit the legend on the right side
  double min,max;
  bool drawn = false;
  min = std::min(TQHistogramUtils::getMinimumBinValue(hist,xmax-width-hmargin,xmax),TQHistogramUtils::getMinimumBinValue(histmax,xmax-width-hmargin,xmax));
  max = std::max(TQHistogramUtils::getMaximumBinValue(hist,xmax-width-hmargin,xmax),TQHistogramUtils::getMaximumBinValue(histmax,xmax-width-hmargin,xmax));
  if(max < top-height-vmargin) {
    // does it fit at the top?
    bottom = top-height;
    drawn = true;
  } else if(min > bottom+height+vmargin) {
    // does it fit at the bottom?
    top = bottom+height;
    drawn = true;
  }
  if(drawn) {
    left = right-width;
  } else {
    // next try: lets fit the legend on the left side
    min = std::min(TQHistogramUtils::getMinimumBinValue(hist,xmin,xmin+width+hmargin_left),TQHistogramUtils::getMinimumBinValue(histmax,xmin,xmin+width+hmargin_left));
    max = std::max(TQHistogramUtils::getMaximumBinValue(hist,xmin,xmin+width+hmargin_left),TQHistogramUtils::getMaximumBinValue(histmax,xmin,xmin+width+hmargin_left));
    if(max < top-height-vmargin) {
      // does it fit at the top?
      bottom = top-height;
      drawn = true;
    } else if(min > bottom+height+vmargin) {
      // does it fit at the bottom?
      top = bottom+height;
      drawn = true;
    }
    if(drawn) right = left+width;
  }
  // Can't make this a unique_ptr because of weird ROOT ownership reasons or something
  // I hope it gets deleted!
  TLegend* legend;
  if(drawn) {
    legend = new TLegend(TQUtils::convertXtoNDC(left),TQUtils::convertYtoNDC(bottom),TQUtils::convertXtoNDC(right),TQUtils::convertYtoNDC(top));
  } else {
    legend = new TLegend(TQUtils::convertXtoNDC(right-width),TQUtils::convertYtoNDC(top-height),TQUtils::convertXtoNDC(right),TQUtils::convertYtoNDC(top));
    // we're unable to fit the legend, we need to rescale 
    if(histmax) histmax->SetMaximum(1.3*histmax->GetMaximum());
    if(hist) hist->SetMaximum(1.3*hist->GetMaximum());
  }
  legend->SetTextSize(tags.getTagDoubleDefault("profile.legend.fontSize",0.04));
  legend->SetFillStyle(3001);
  legend->SetFillColor(kWhite);
  legend->SetBorderSize(0);
  if (graph) { // Add entry with style from graphs
    legend->AddEntry(graph, histlabel, "P");
    if(graphmax) legend->AddEntry(graphmax,tags.getTagStringDefault("style.optimum.label","profiled optimum"), "P");
  } else {
    if(histmax) legend->AddEntry(histmax,tags.getTagStringDefault("style.optimum.label","profiled optimum"), "L");
    if(hist) legend->AddEntry(hist, histlabel, "LE");
  }
  if(cutline) legend->AddEntry(cutline,tags.getTagStringDefault("style.cutline.label","current cut value"),"L");
  if(legend) {
    legend->Draw();
  }
}

TString TQGridScanStyle::getObsTitleSuffix(TString /*obsName*/, BoundDirection direction) {
  // set the variable title of the given variable
  TString suffix;
  switch (direction) {
    case BoundDirection::lower:
      suffix = "min";
      break;
    case BoundDirection::upper:
      suffix = "max";
      break;
    case BoundDirection::split:
      suffix = "split";
      break;
  }
  return suffix;
}

void TQGridScanStyle::fillHists(TH1F* hist, TH1F* histSquares, TH1F* histFills, int nBin, double significance, int topNumber, bool showUnderflow, bool showOverflow) {
  auto nBins = hist->GetNbinsX();
  if(nBin < 1) {
    nBin = showUnderflow ? 1 : 0;
  } else if(nBin > nBins) {
    nBin = showOverflow ? nBins : nBins + 1;
  }
  if(histFills->GetBinContent(nBin) < topNumber) {
    hist->AddBinContent(nBin, significance);
    histSquares->AddBinContent(nBin, significance*significance);
    histFills->AddBinContent(nBin, 1);
  }
}

void TQGridScanStyle::fillErrors(TH1F* hist, TH1F* histSquares, TH1F* histFills) {
  for(int iBin=0; iBin<hist->GetNbinsX()+2; iBin++) {
    if(histFills->GetBinContent(iBin) > 1) {
      double err = sqrt(histSquares->GetBinContent(iBin) - pow(hist->GetBinContent(iBin),2));
      // check for nan in the case where the sum of squares and the square sum
      // are identical enough so that err will be the sqrt of a negative (yet small) number
      if(err != err) hist->SetBinError(iBin,0);
      // cut off exceedingly large error bars
      // relative errors on Z_exp larger than 100% are not sensible anymore
      else if(err > hist->GetBinContent(iBin)) hist->SetBinError(iBin, hist->GetBinContent(iBin));
      // set the error
      else hist->SetBinError(iBin,err);
    } else {
      hist->SetBinError(iBin,0);
    }
  }
}

void TQGridScanStyle::excludeOverflow(TAxis* axis) {
  auto first = axis->GetFirst();
  auto last = axis->GetLast();
  auto nBins = axis->GetNbins();
  auto showsUnderflow = first == 0;
  auto showsOverflow = last == nBins + 1;
  if (showsUnderflow and showsOverflow) {
    axis->SetRange(1, nBins);
  } else if (showsUnderflow) {
    axis->SetRange(1, last);
  } else if (showsOverflow) {
    axis->SetRange(first, nBins);
  }
}

void TQGridScanStyle::printDelimiter(int i, int n) {
  if(i == n) {
    std::cout << "; ";
  } else {
    std::cout << ", ";
  }
}

#if 0
Bound* TQGridScanStyle::getBound(TQGridScanObservable* obs, BoundDirection direction) {
  auto& bounds = obs->normalBounds();
  return (direction == BoundDirection::lower) ? &bounds.lower : &bounds.upper;
}

// Split bound
Bound* TQGridScanStyle::getSplitBound(TQGridScanObservable* obs) {
  return &obs->splitBounds();
}
#endif


 TQGridScanStyle.cxx:1
 TQGridScanStyle.cxx:2
 TQGridScanStyle.cxx:3
 TQGridScanStyle.cxx:4
 TQGridScanStyle.cxx:5
 TQGridScanStyle.cxx:6
 TQGridScanStyle.cxx:7
 TQGridScanStyle.cxx:8
 TQGridScanStyle.cxx:9
 TQGridScanStyle.cxx:10
 TQGridScanStyle.cxx:11
 TQGridScanStyle.cxx:12
 TQGridScanStyle.cxx:13
 TQGridScanStyle.cxx:14
 TQGridScanStyle.cxx:15
 TQGridScanStyle.cxx:16
 TQGridScanStyle.cxx:17
 TQGridScanStyle.cxx:18
 TQGridScanStyle.cxx:19
 TQGridScanStyle.cxx:20
 TQGridScanStyle.cxx:21
 TQGridScanStyle.cxx:22
 TQGridScanStyle.cxx:23
 TQGridScanStyle.cxx:24
 TQGridScanStyle.cxx:25
 TQGridScanStyle.cxx:26
 TQGridScanStyle.cxx:27
 TQGridScanStyle.cxx:28
 TQGridScanStyle.cxx:29
 TQGridScanStyle.cxx:30
 TQGridScanStyle.cxx:31
 TQGridScanStyle.cxx:32
 TQGridScanStyle.cxx:33
 TQGridScanStyle.cxx:34
 TQGridScanStyle.cxx:35
 TQGridScanStyle.cxx:36
 TQGridScanStyle.cxx:37
 TQGridScanStyle.cxx:38
 TQGridScanStyle.cxx:39
 TQGridScanStyle.cxx:40
 TQGridScanStyle.cxx:41
 TQGridScanStyle.cxx:42
 TQGridScanStyle.cxx:43
 TQGridScanStyle.cxx:44
 TQGridScanStyle.cxx:45
 TQGridScanStyle.cxx:46
 TQGridScanStyle.cxx:47
 TQGridScanStyle.cxx:48
 TQGridScanStyle.cxx:49
 TQGridScanStyle.cxx:50
 TQGridScanStyle.cxx:51
 TQGridScanStyle.cxx:52
 TQGridScanStyle.cxx:53
 TQGridScanStyle.cxx:54
 TQGridScanStyle.cxx:55
 TQGridScanStyle.cxx:56
 TQGridScanStyle.cxx:57
 TQGridScanStyle.cxx:58
 TQGridScanStyle.cxx:59
 TQGridScanStyle.cxx:60
 TQGridScanStyle.cxx:61
 TQGridScanStyle.cxx:62
 TQGridScanStyle.cxx:63
 TQGridScanStyle.cxx:64
 TQGridScanStyle.cxx:65
 TQGridScanStyle.cxx:66
 TQGridScanStyle.cxx:67
 TQGridScanStyle.cxx:68
 TQGridScanStyle.cxx:69
 TQGridScanStyle.cxx:70
 TQGridScanStyle.cxx:71
 TQGridScanStyle.cxx:72
 TQGridScanStyle.cxx:73
 TQGridScanStyle.cxx:74
 TQGridScanStyle.cxx:75
 TQGridScanStyle.cxx:76
 TQGridScanStyle.cxx:77
 TQGridScanStyle.cxx:78
 TQGridScanStyle.cxx:79
 TQGridScanStyle.cxx:80
 TQGridScanStyle.cxx:81
 TQGridScanStyle.cxx:82
 TQGridScanStyle.cxx:83
 TQGridScanStyle.cxx:84
 TQGridScanStyle.cxx:85
 TQGridScanStyle.cxx:86
 TQGridScanStyle.cxx:87
 TQGridScanStyle.cxx:88
 TQGridScanStyle.cxx:89
 TQGridScanStyle.cxx:90
 TQGridScanStyle.cxx:91
 TQGridScanStyle.cxx:92
 TQGridScanStyle.cxx:93
 TQGridScanStyle.cxx:94
 TQGridScanStyle.cxx:95
 TQGridScanStyle.cxx:96
 TQGridScanStyle.cxx:97
 TQGridScanStyle.cxx:98
 TQGridScanStyle.cxx:99
 TQGridScanStyle.cxx:100
 TQGridScanStyle.cxx:101
 TQGridScanStyle.cxx:102
 TQGridScanStyle.cxx:103
 TQGridScanStyle.cxx:104
 TQGridScanStyle.cxx:105
 TQGridScanStyle.cxx:106
 TQGridScanStyle.cxx:107
 TQGridScanStyle.cxx:108
 TQGridScanStyle.cxx:109
 TQGridScanStyle.cxx:110
 TQGridScanStyle.cxx:111
 TQGridScanStyle.cxx:112
 TQGridScanStyle.cxx:113
 TQGridScanStyle.cxx:114
 TQGridScanStyle.cxx:115
 TQGridScanStyle.cxx:116
 TQGridScanStyle.cxx:117
 TQGridScanStyle.cxx:118
 TQGridScanStyle.cxx:119
 TQGridScanStyle.cxx:120
 TQGridScanStyle.cxx:121
 TQGridScanStyle.cxx:122
 TQGridScanStyle.cxx:123
 TQGridScanStyle.cxx:124
 TQGridScanStyle.cxx:125
 TQGridScanStyle.cxx:126
 TQGridScanStyle.cxx:127
 TQGridScanStyle.cxx:128
 TQGridScanStyle.cxx:129
 TQGridScanStyle.cxx:130
 TQGridScanStyle.cxx:131
 TQGridScanStyle.cxx:132
 TQGridScanStyle.cxx:133
 TQGridScanStyle.cxx:134
 TQGridScanStyle.cxx:135
 TQGridScanStyle.cxx:136
 TQGridScanStyle.cxx:137
 TQGridScanStyle.cxx:138
 TQGridScanStyle.cxx:139
 TQGridScanStyle.cxx:140
 TQGridScanStyle.cxx:141
 TQGridScanStyle.cxx:142
 TQGridScanStyle.cxx:143
 TQGridScanStyle.cxx:144
 TQGridScanStyle.cxx:145
 TQGridScanStyle.cxx:146
 TQGridScanStyle.cxx:147
 TQGridScanStyle.cxx:148
 TQGridScanStyle.cxx:149
 TQGridScanStyle.cxx:150
 TQGridScanStyle.cxx:151
 TQGridScanStyle.cxx:152
 TQGridScanStyle.cxx:153
 TQGridScanStyle.cxx:154
 TQGridScanStyle.cxx:155
 TQGridScanStyle.cxx:156
 TQGridScanStyle.cxx:157
 TQGridScanStyle.cxx:158
 TQGridScanStyle.cxx:159
 TQGridScanStyle.cxx:160
 TQGridScanStyle.cxx:161
 TQGridScanStyle.cxx:162
 TQGridScanStyle.cxx:163
 TQGridScanStyle.cxx:164
 TQGridScanStyle.cxx:165
 TQGridScanStyle.cxx:166
 TQGridScanStyle.cxx:167
 TQGridScanStyle.cxx:168
 TQGridScanStyle.cxx:169
 TQGridScanStyle.cxx:170
 TQGridScanStyle.cxx:171
 TQGridScanStyle.cxx:172
 TQGridScanStyle.cxx:173
 TQGridScanStyle.cxx:174
 TQGridScanStyle.cxx:175
 TQGridScanStyle.cxx:176
 TQGridScanStyle.cxx:177
 TQGridScanStyle.cxx:178
 TQGridScanStyle.cxx:179
 TQGridScanStyle.cxx:180
 TQGridScanStyle.cxx:181
 TQGridScanStyle.cxx:182
 TQGridScanStyle.cxx:183
 TQGridScanStyle.cxx:184
 TQGridScanStyle.cxx:185
 TQGridScanStyle.cxx:186
 TQGridScanStyle.cxx:187
 TQGridScanStyle.cxx:188
 TQGridScanStyle.cxx:189
 TQGridScanStyle.cxx:190
 TQGridScanStyle.cxx:191
 TQGridScanStyle.cxx:192
 TQGridScanStyle.cxx:193
 TQGridScanStyle.cxx:194
 TQGridScanStyle.cxx:195
 TQGridScanStyle.cxx:196
 TQGridScanStyle.cxx:197
 TQGridScanStyle.cxx:198
 TQGridScanStyle.cxx:199
 TQGridScanStyle.cxx:200
 TQGridScanStyle.cxx:201
 TQGridScanStyle.cxx:202
 TQGridScanStyle.cxx:203
 TQGridScanStyle.cxx:204
 TQGridScanStyle.cxx:205
 TQGridScanStyle.cxx:206
 TQGridScanStyle.cxx:207
 TQGridScanStyle.cxx:208
 TQGridScanStyle.cxx:209
 TQGridScanStyle.cxx:210
 TQGridScanStyle.cxx:211
 TQGridScanStyle.cxx:212
 TQGridScanStyle.cxx:213
 TQGridScanStyle.cxx:214
 TQGridScanStyle.cxx:215
 TQGridScanStyle.cxx:216
 TQGridScanStyle.cxx:217
 TQGridScanStyle.cxx:218
 TQGridScanStyle.cxx:219
 TQGridScanStyle.cxx:220
 TQGridScanStyle.cxx:221
 TQGridScanStyle.cxx:222
 TQGridScanStyle.cxx:223
 TQGridScanStyle.cxx:224
 TQGridScanStyle.cxx:225
 TQGridScanStyle.cxx:226
 TQGridScanStyle.cxx:227
 TQGridScanStyle.cxx:228
 TQGridScanStyle.cxx:229
 TQGridScanStyle.cxx:230
 TQGridScanStyle.cxx:231
 TQGridScanStyle.cxx:232
 TQGridScanStyle.cxx:233
 TQGridScanStyle.cxx:234
 TQGridScanStyle.cxx:235
 TQGridScanStyle.cxx:236
 TQGridScanStyle.cxx:237
 TQGridScanStyle.cxx:238
 TQGridScanStyle.cxx:239
 TQGridScanStyle.cxx:240
 TQGridScanStyle.cxx:241
 TQGridScanStyle.cxx:242
 TQGridScanStyle.cxx:243
 TQGridScanStyle.cxx:244
 TQGridScanStyle.cxx:245
 TQGridScanStyle.cxx:246
 TQGridScanStyle.cxx:247
 TQGridScanStyle.cxx:248
 TQGridScanStyle.cxx:249
 TQGridScanStyle.cxx:250
 TQGridScanStyle.cxx:251
 TQGridScanStyle.cxx:252
 TQGridScanStyle.cxx:253
 TQGridScanStyle.cxx:254
 TQGridScanStyle.cxx:255
 TQGridScanStyle.cxx:256
 TQGridScanStyle.cxx:257
 TQGridScanStyle.cxx:258
 TQGridScanStyle.cxx:259
 TQGridScanStyle.cxx:260
 TQGridScanStyle.cxx:261
 TQGridScanStyle.cxx:262
 TQGridScanStyle.cxx:263
 TQGridScanStyle.cxx:264
 TQGridScanStyle.cxx:265
 TQGridScanStyle.cxx:266
 TQGridScanStyle.cxx:267
 TQGridScanStyle.cxx:268
 TQGridScanStyle.cxx:269
 TQGridScanStyle.cxx:270
 TQGridScanStyle.cxx:271
 TQGridScanStyle.cxx:272
 TQGridScanStyle.cxx:273
 TQGridScanStyle.cxx:274
 TQGridScanStyle.cxx:275
 TQGridScanStyle.cxx:276
 TQGridScanStyle.cxx:277
 TQGridScanStyle.cxx:278
 TQGridScanStyle.cxx:279
 TQGridScanStyle.cxx:280
 TQGridScanStyle.cxx:281
 TQGridScanStyle.cxx:282
 TQGridScanStyle.cxx:283
 TQGridScanStyle.cxx:284
 TQGridScanStyle.cxx:285
 TQGridScanStyle.cxx:286
 TQGridScanStyle.cxx:287
 TQGridScanStyle.cxx:288
 TQGridScanStyle.cxx:289
 TQGridScanStyle.cxx:290
 TQGridScanStyle.cxx:291
 TQGridScanStyle.cxx:292
 TQGridScanStyle.cxx:293
 TQGridScanStyle.cxx:294
 TQGridScanStyle.cxx:295
 TQGridScanStyle.cxx:296
 TQGridScanStyle.cxx:297
 TQGridScanStyle.cxx:298
 TQGridScanStyle.cxx:299
 TQGridScanStyle.cxx:300
 TQGridScanStyle.cxx:301
 TQGridScanStyle.cxx:302
 TQGridScanStyle.cxx:303
 TQGridScanStyle.cxx:304
 TQGridScanStyle.cxx:305
 TQGridScanStyle.cxx:306
 TQGridScanStyle.cxx:307
 TQGridScanStyle.cxx:308
 TQGridScanStyle.cxx:309
 TQGridScanStyle.cxx:310
 TQGridScanStyle.cxx:311
 TQGridScanStyle.cxx:312
 TQGridScanStyle.cxx:313
 TQGridScanStyle.cxx:314
 TQGridScanStyle.cxx:315