OSDN Git Service

adds .gitignore
[qcad/qcad.git] / qcadwin / main.cpp
1 //---------------------------------------------------------------------------\r
2 // Main Form\r
3 //---------------------------------------------------------------------------\r
4 #include <vcl.h>\r
5 #include <ShellApi.h>\r
6 #include <Printers.hpp>\r
7 #include <iostream>\r
8 #include <fstream>\r
9 #pragma hdrstop\r
10 //---------------------------------------------------------------------------\r
11 #include "CPanel.h"\r
12 #include "Graph.h"\r
13 #include "Param.h"\r
14 #include "Preview.h"\r
15 #include "New.h"\r
16 #include "Version.h"\r
17 #include "main.h"\r
18 //---------------------------------------------------------------------------\r
19 #pragma package(smart_init)\r
20 #pragma resource "*.dfm"\r
21 \r
22 TFMain *FMain;\r
23 //---------------------------------------------------------------------------\r
24 const char * Version = "QCAD - 2.00";\r
25 const char * QCADHP = "http://qcad.sourceforge.jp/";\r
26 //---------------------------------------------------------------------------\r
27 /**\r
28  * Constructor\r
29  * Initialize\r
30  */\r
31 __fastcall\r
32 TFMain::TFMain(TComponent* Owner) : TForm(Owner) {\r
33 \r
34   //Accept Dropping files.\r
35   DragAcceptFiles(Handle,true);\r
36   Application->HelpFile = ExtractFileDir(Application->ExeName)+"\\qcad.hlp";\r
37 \r
38   qDraw = new QDraw(Image->Canvas);\r
39   qManager = new QManager();\r
40   qBits = new QBits();\r
41   ChangeSize(qManager->GetLineNumber(),qManager->GetColumnNumber());\r
42   qManager->DrawAll(qDraw);\r
43   UpdateCaption();\r
44   htmlhelp = Htmlhelp::GetInstance();\r
45 }\r
46 //---------------------------------------------------------------------------\r
47 /**\r
48  * Destructer\r
49  */\r
50 void __fastcall\r
51 TFMain::FormClose(TObject *Sender, TCloseAction &Action) {\r
52   delete qBits;\r
53   delete qDraw;\r
54   delete qManager;\r
55 }\r
56 //---------------------------------------------------------------------------\r
57 void\r
58 TFMain::UpdateCaption(void) {\r
59   AnsiString FileName = qManager->GetFileName().c_str();\r
60   if (FileName =="") {\r
61     if (qManager->IsModified()) {\r
62       Caption = "QCAD * NewCircuit";\r
63     } else {\r
64       Caption = "QCAD - NewCircuit";\r
65     }\r
66   } else {\r
67     if (qManager->IsModified()) {\r
68       Caption = "QCAD * "+FileName;\r
69     } else {\r
70       Caption = "QCAD - "+FileName;\r
71     }\r
72   }\r
73 }\r
74 //---------------------------------------------------------------------------\r
75 /**\r
76  * Change Circuit Size\r
77  */\r
78 void\r
79 TFMain::ChangeSize(int Line,int Column) {\r
80 \r
81   int GridSize = qDraw->GetGridSize();\r
82   int LineNumber = Line;\r
83   int ColumnNumber = Column;\r
84   Image->Picture = NULL;\r
85   Image->Height = LineNumber * GridSize + GridSize;\r
86   Image->Width = ColumnNumber * GridSize + GridSize*2;\r
87   Image->Canvas->Brush->Color = clWhite;\r
88   Image->Canvas->FillRect(Rect(0,0,Image->Width,Image->Height));\r
89 \r
90   ClientWidth = Image->Width;\r
91   ClientHeight = Image->Height+ToolBar->Height;\r
92 \r
93   if (ClientWidth > MAX_WIDTH) {\r
94     ClientWidth = MAX_WIDTH;\r
95   }\r
96   if (ClientHeight > MAX_HEIGHT) {\r
97     ClientHeight = MAX_HEIGHT;\r
98   }\r
99   qDraw->SetCanvas(Image->Canvas);\r
100   UpdateCaption();\r
101 }\r
102 //---------------------------------------------------------------------------\r
103 void\r
104 TFMain::EraseCircuit(int mx, int my) {\r
105   QCircuit *qc = qManager->GetCircuitInclude(mx,my);\r
106   if (qc==NULL || mx == 0) {\r
107     return;\r
108   }\r
109   qManager->RemoveCircuit(qc);\r
110   qManager->DrawAll(qDraw);\r
111   UpdateCaption();\r
112 }\r
113 //---------------------------------------------------------------------------\r
114 void\r
115 TFMain::SelectCircuit(int mx, int my) {\r
116   QCircuit *qc = qManager->GetCircuitInclude(mx,my);\r
117 \r
118   if (qc == NULL) {\r
119     qManager->RemoveSelect(qDraw);\r
120     return;\r
121   }\r
122 \r
123   if (GetAsyncKeyState(VK_CONTROL)<0) {\r
124     qManager->AddSelect(qc, qDraw);\r
125   } else {\r
126     qManager->RemoveSelect(qDraw);\r
127     qManager->AddSelect(qc, qDraw);\r
128   }\r
129 }\r
130 //---------------------------------------------------------------------------\r
131 void\r
132 TFMain::PutCircuit(int mx, int my) {\r
133   FParam->CreateCircuit(FCPanel->GetCircuit(),mx,my,qDraw,qManager);\r
134   qManager->DrawAll(qDraw);\r
135   UpdateCaption();\r
136 }\r
137 //---------------------------------------------------------------------------\r
138 void\r
139 TFMain::ModifyCircuit(void) {\r
140 \r
141   qManager->RemoveSelect(qDraw);\r
142   int mx = qDraw->GetPosX(MX);\r
143   int my = qDraw->GetPosY(MY);\r
144 \r
145   QCircuit *qc = qManager->GetCircuitInclude(mx, my);\r
146   if (qc==NULL) {\r
147     return;\r
148   }\r
149 \r
150   FParam->ModifyCircuit(qc,qManager);\r
151   qManager->DrawAll(qDraw);\r
152   UpdateCaption();\r
153 }\r
154 //---------------------------------------------------------------------------\r
155 void\r
156 TFMain::WMDropFiles(TWMDropFiles &Msg) {\r
157 \r
158   Show();\r
159   SetFocus();\r
160   SetForegroundWindow(Handle);\r
161 \r
162   char filename[MAX_PATH+1];\r
163   int FileNum = DragQueryFile((void*)Msg.Drop,-1,NULL,0);\r
164   if (FileNum!=1) {\r
165     ShowMessage("QCAD does not support multi-file drop.");\r
166     return;\r
167   }\r
168 \r
169   DragQueryFile((void*)Msg.Drop,0,filename,sizeof(filename));\r
170   DragFinish((void*)Msg.Drop);\r
171 \r
172   AnsiString FileName = filename;\r
173   AnsiString Ext = ExtractFileExt(FileName);\r
174 \r
175   if (Ext == ".qdt") {\r
176     ImportResult(FileName.c_str());\r
177   } else if (Ext == ".qcd") {\r
178     OpenFile(FileName.c_str());\r
179   } else {\r
180     ShowMessage("QCAD does not support this file type.");\r
181   }\r
182 }\r
183 //---------------------------------------------------------------------------\r
184 /**\r
185  * Save\r
186  * return value\r
187  * true : File is saved\r
188  * false : File is not saved(Canceled)\r
189  */\r
190 bool\r
191 TFMain::Save(void) {\r
192   AnsiString FileName = qManager->GetFileName().c_str();\r
193   if (FileName=="") {\r
194     SaveDialog->Filter = "QCAD Files(*.qcd)|*.qcd|All Files(*.*)|*.*";\r
195     SaveDialog->DefaultExt = "qcd";\r
196     SaveDialog->FileName = "";\r
197     if (!SaveDialog->Execute()) {\r
198       return false;\r
199     }\r
200     FileName = SaveDialog->FileName;\r
201   }\r
202   qManager->SaveToFile(FileName.c_str());\r
203   UpdateCaption();\r
204   return true;\r
205 }\r
206 //---------------------------------------------------------------------------\r
207 /**\r
208  * Save Query\r
209  * return value\r
210  * true: One can proceed.\r
211  * false: Process is canceled.\r
212  */\r
213 bool\r
214 TFMain::SaveQuery(void) {\r
215   if (!qManager->IsModified()) {\r
216     return true;\r
217   }\r
218 \r
219   int r = MessageBox(Handle, "File is modified, save it before quit?","QCAD - Alert",MB_YESNOCANCEL);\r
220 \r
221   if (r == IDYES) {\r
222     return Save();\r
223   } else if (r == IDNO) {\r
224     return true;\r
225   }\r
226   return false;\r
227 }\r
228 //---------------------------------------------------------------------------\r
229 void\r
230 TFMain::ImportResult(char *FileName) {\r
231 \r
232   qBits->LoadFromFile(FileName);\r
233   qManager->CalcAll(qBits);\r
234 \r
235   FGraph->Show();\r
236   FGraph->Execute(qBits);\r
237 }\r
238 //---------------------------------------------------------------------------\r
239 void\r
240 TFMain::OpenFile(AnsiString FileName) {\r
241   qManager->LoadFromFile(FileName.c_str());\r
242   ChangeSize(qManager->GetLineNumber(),qManager->GetColumnNumber());\r
243   qManager->DrawAll(qDraw);\r
244   UpdateCaption();\r
245 }\r
246 //---------------------------------------------------------------------------\r
247 // Events of Menu\r
248 //---------------------------------------------------------------------------\r
249 /**\r
250  * New Circuit\r
251  */\r
252 void __fastcall\r
253 TFMain::MMNewClick(TObject *Sender) {\r
254   if (!SaveQuery()) {\r
255     return;\r
256   }\r
257   if (!FNew->Execute(qManager->GetLineNumber(),qManager->GetColumnNumber())) {\r
258     return;\r
259   }\r
260 \r
261   ChangeSize(FNew->GetLineNumber(),FNew->GetColumnNumber());\r
262   qManager->Init(FNew->GetLineNumber(),FNew->GetColumnNumber());\r
263   qManager->DrawAll(qDraw);\r
264   UpdateCaption();\r
265 }\r
266 //---------------------------------------------------------------------------\r
267 /**\r
268  * Open\r
269  */\r
270 void __fastcall\r
271 TFMain::MMOpenClick(TObject *Sender) {\r
272   OpenDialog->Filter = "QCAD Files(*.qcd)|*.qcd|All Files(*.*)|*.*";\r
273   OpenDialog->DefaultExt = "qcd";\r
274   if (!OpenDialog->Execute()) {\r
275     return;\r
276   }\r
277   OpenFile(OpenDialog->FileName);\r
278 }\r
279 //---------------------------------------------------------------------------\r
280 /**\r
281  * Save\r
282  */\r
283 void __fastcall\r
284 TFMain::MMSaveClick(TObject *Sender) {\r
285   Save();\r
286 }\r
287 //---------------------------------------------------------------------------\r
288 /**\r
289  * Save as\r
290  */\r
291 void __fastcall\r
292 TFMain::MMSaveAsClick(TObject *Sender) {\r
293   SaveDialog->Filter = "QCAD Files(*.qcd)|*.qcd|All Files(*.*)|*.*";\r
294   SaveDialog->DefaultExt = "qcd";\r
295   SaveDialog->FileName = "";\r
296   if (!SaveDialog->Execute()) {\r
297     return;\r
298   }\r
299   qManager->SetFileName(SaveDialog->FileName.c_str());\r
300   Save();\r
301 }\r
302 //---------------------------------------------------------------------------\r
303 /**\r
304  * Save as EPS file\r
305  */\r
306 void __fastcall\r
307 TFMain::MMSaveAsPSClick(TObject *Sender) {\r
308 \r
309   SaveDialog->Filter = "PostScriptFiles(*.eps)|*.eps|All Files(*.*)|*.*";\r
310   SaveDialog->DefaultExt = "eps";\r
311   SaveDialog->FileName = "";\r
312   if (!SaveDialog->Execute()) {\r
313     return;\r
314   }\r
315   qManager->SaveAsEPS(SaveDialog->FileName.c_str());\r
316 }\r
317 //---------------------------------------------------------------------------\r
318 /**\r
319  * Save as Bitmap File\r
320  */\r
321 void __fastcall\r
322 TFMain::MMSaveAsBMPClick(TObject *Sender) {\r
323   SaveDialog->Filter = "BitmapFiles(*.bmp)|*.bmp|All Files(*.*)|*.*";\r
324   SaveDialog->DefaultExt = "bmp";\r
325   SaveDialog->FileName = "";\r
326   if (!SaveDialog->Execute()) {\r
327     return;\r
328   }\r
329   Image->Picture->Bitmap->HandleType = bmDIB;\r
330   Image->Picture->Bitmap->PixelFormat = pf8bit;\r
331   Image->Picture->Bitmap->SaveToFile(SaveDialog->FileName);\r
332 }\r
333 //---------------------------------------------------------------------------\r
334 void __fastcall\r
335 TFMain::MMCircuitPanelClick(TObject *Sender) {\r
336   FCPanel->Show();\r
337 }\r
338 //---------------------------------------------------------------------------\r
339 void __fastcall\r
340 TFMain::MMPrintClick(TObject *Sender) {\r
341 \r
342   if (!PrintDialog->Execute())return;\r
343 \r
344   TPrinter *p = Printer();\r
345   int x = GetDeviceCaps(p->Handle, LOGPIXELSX);\r
346   int y = GetDeviceCaps(p->Handle, LOGPIXELSY);\r
347   int gridx = 10  * x / qManager->GetColumnNumber();\r
348   int gridy = int(7.4 * y / qManager->GetLineNumber());\r
349 \r
350   QDraw *qPrintDraw  = new QDraw(p->Canvas);\r
351   p->Orientation = poLandscape;\r
352   p->BeginDoc();\r
353   if (gridx < gridy) {\r
354     qPrintDraw->SetGridSize(gridx);\r
355   } else {\r
356     qPrintDraw->SetGridSize(gridy);\r
357   }\r
358   qManager->DrawAllPrinter(qPrintDraw);\r
359 \r
360   p->EndDoc();\r
361   delete qPrintDraw;\r
362 }\r
363 //---------------------------------------------------------------------------\r
364 void __fastcall\r
365 TFMain::MMPrintSetupClick(TObject *Sender) {\r
366 \r
367   TPrinter *p = Printer();\r
368   p->Orientation = poLandscape;\r
369 \r
370   if (!PrinterSetupDialog->Execute()) {\r
371     return;\r
372   }\r
373 }\r
374 //---------------------------------------------------------------------------\r
375 void __fastcall\r
376 TFMain::MMExitClick(TObject *Sender) {\r
377   Close();\r
378 }\r
379 //---------------------------------------------------------------------------\r
380 void __fastcall\r
381 TFMain::MMUndoClick(TObject *Sender) {\r
382   qManager->Undo(qDraw);\r
383   UpdateCaption();\r
384 }\r
385 //---------------------------------------------------------------------------\r
386 /**\r
387  * Remove\r
388  */\r
389 void __fastcall\r
390 TFMain::MMRemoveClick(TObject *Sender) {\r
391   qManager->RemoveSelectedCircuits(qDraw);\r
392   UpdateCaption();\r
393 }\r
394 //---------------------------------------------------------------------------\r
395 void __fastcall\r
396 TFMain::MMRunClick(TObject *Sender) {\r
397 \r
398   if (qManager->GetLineNumber()>20) {\r
399     int r = MessageBox(Handle,\r
400                        "You are going to calculate a large circuit.\n"\r
401                        "It may require huge memory and time.\n"\r
402                        "Are you sure to execute?","QCAD - Alert",MB_YESNO);\r
403 \r
404     if (r == IDNO)return;\r
405   }\r
406 \r
407   qBits->Allocate(qManager->GetLineNumber());\r
408   qManager->CalcAll(qBits);\r
409 \r
410   FGraph->Execute(qBits);\r
411 }\r
412 //---------------------------------------------------------------------------\r
413 void __fastcall\r
414 TFMain::MMImportResultClick(TObject *Sender) {\r
415   OpenDialog->Filter = "QCAD Results(*.qdt)|*.qdt|All Files(*.*)|*.*";\r
416   OpenDialog->DefaultExt = "qdt";\r
417   if (!OpenDialog->Execute()) {\r
418     return;\r
419   }\r
420   char *FileName = OpenDialog->FileName.c_str();\r
421   ImportResult(FileName);\r
422 }\r
423 //---------------------------------------------------------------------------\r
424 void __fastcall\r
425 TFMain::MMHelpClick(TObject *Sender) {\r
426   AnsiString HtmlHelp = ExtractFileDir(Application->ExeName) + "\\qcadhelp.chm";\r
427   if(!FileExists(HtmlHelp)){\r
428     ShowMessage("Cannot find help file " + HtmlHelp);\r
429   }else{\r
430     htmlhelp->ShowHtmlHelp(this->Handle,HtmlHelp.c_str());\r
431   }\r
432 }\r
433 //---------------------------------------------------------------------------\r
434 void __fastcall\r
435 TFMain::MMAboutClick(TObject *Sender) {\r
436   FVersion->ShowModal();\r
437 }\r
438 //---------------------------------------------------------------------------\r
439 void __fastcall\r
440 TFMain::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {\r
441   MX = X;\r
442   MY = Y;\r
443 }\r
444 //---------------------------------------------------------------------------\r
445 void __fastcall\r
446 TFMain::FormMouseWheel(TObject *Sender, TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled) {\r
447   const double d = 0.5;\r
448   if (!VertScrollBar->Visible) {\r
449     return;\r
450   }\r
451   int pos = VertScrollBar->Position;\r
452   pos -= (int)(WheelDelta*d);\r
453 \r
454   if (pos < 0) {\r
455     pos = 0;\r
456   }\r
457   if (pos > VertScrollBar->Range) {\r
458     pos = VertScrollBar->Range;\r
459   }\r
460   VertScrollBar->Position = pos;\r
461 }\r
462 //---------------------------------------------------------------------------\r
463 void __fastcall\r
464 TFMain::ImageDblClick(TObject *Sender) {\r
465   ModifyCircuit();\r
466 }\r
467 //---------------------------------------------------------------------------\r
468 void __fastcall\r
469 TFMain::ImageClick(TObject *Sender) {\r
470   int mx = qDraw->GetPosX(MX);\r
471   int my = qDraw->GetPosY(MY);\r
472   if (mx<0 || mx>=qManager->GetColumnNumber()) {\r
473     return;\r
474   }\r
475   if (my<0 || my>=qManager->GetLineNumber()) {\r
476     return;\r
477   }\r
478   if (FCPanel->GetCircuit() == CP_ERASE) {\r
479     EraseCircuit(mx,my);\r
480   } else if (FCPanel->GetCircuit() == CP_ARROW) {\r
481     SelectCircuit(mx,my);\r
482   } else {\r
483     PutCircuit(mx,my);\r
484   }\r
485 \r
486 }\r
487 //---------------------------------------------------------------------------\r
488 void __fastcall\r
489 TFMain::FormDeactivate(TObject *Sender) {\r
490   qManager->RemoveSelect(qDraw);\r
491 }\r
492 //---------------------------------------------------------------------------\r
493 \r
494 void __fastcall\r
495 TFMain::FormCloseQuery(TObject *Sender, bool &CanClose) {\r
496   if (!SaveQuery()) {\r
497     CanClose = false;\r
498   }\r
499 }\r
500 //---------------------------------------------------------------------------\r
501 void __fastcall\r
502 TFMain::MMPreViewPrintClick(TObject *Sender) {\r
503   FPreview->Execute(qManager);\r
504 }\r
505 //---------------------------------------------------------------------------\r
506 void __fastcall\r
507 TFMain::MMShowAllClick(TObject *Sender) {\r
508   MMShowAll->Checked = true;\r
509 }\r
510 //---------------------------------------------------------------------------\r
511 void __fastcall\r
512 TFMain::MMShowNonZeroClick(TObject *Sender) {\r
513   MMShowNonZero->Checked = true;\r
514 }\r
515 //---------------------------------------------------------------------------\r
516 \r