1 //---------------------------------------------------------------------------
\r
3 //---------------------------------------------------------------------------
\r
5 #include <ShellApi.h>
\r
6 #include <Printers.hpp>
\r
10 //---------------------------------------------------------------------------
\r
14 #include "Preview.h"
\r
16 #include "Version.h"
\r
18 //---------------------------------------------------------------------------
\r
19 #pragma package(smart_init)
\r
20 #pragma resource "*.dfm"
\r
23 //---------------------------------------------------------------------------
\r
24 const char * Version = "QCAD - 2.00";
\r
25 const char * QCADHP = "http://qcad.sourceforge.jp/";
\r
26 //---------------------------------------------------------------------------
\r
32 TFMain::TFMain(TComponent* Owner) : TForm(Owner) {
\r
34 //Accept Dropping files.
\r
35 DragAcceptFiles(Handle,true);
\r
36 Application->HelpFile = ExtractFileDir(Application->ExeName)+"\\qcad.hlp";
\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
44 htmlhelp = Htmlhelp::GetInstance();
\r
46 //---------------------------------------------------------------------------
\r
51 TFMain::FormClose(TObject *Sender, TCloseAction &Action) {
\r
56 //---------------------------------------------------------------------------
\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
64 Caption = "QCAD - NewCircuit";
\r
67 if (qManager->IsModified()) {
\r
68 Caption = "QCAD * "+FileName;
\r
70 Caption = "QCAD - "+FileName;
\r
74 //---------------------------------------------------------------------------
\r
76 * Change Circuit Size
\r
79 TFMain::ChangeSize(int Line,int Column) {
\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
90 ClientWidth = Image->Width;
\r
91 ClientHeight = Image->Height+ToolBar->Height;
\r
93 if (ClientWidth > MAX_WIDTH) {
\r
94 ClientWidth = MAX_WIDTH;
\r
96 if (ClientHeight > MAX_HEIGHT) {
\r
97 ClientHeight = MAX_HEIGHT;
\r
99 qDraw->SetCanvas(Image->Canvas);
\r
102 //---------------------------------------------------------------------------
\r
104 TFMain::EraseCircuit(int mx, int my) {
\r
105 QCircuit *qc = qManager->GetCircuitInclude(mx,my);
\r
106 if (qc==NULL || mx == 0) {
\r
109 qManager->RemoveCircuit(qc);
\r
110 qManager->DrawAll(qDraw);
\r
113 //---------------------------------------------------------------------------
\r
115 TFMain::SelectCircuit(int mx, int my) {
\r
116 QCircuit *qc = qManager->GetCircuitInclude(mx,my);
\r
119 qManager->RemoveSelect(qDraw);
\r
123 if (GetAsyncKeyState(VK_CONTROL)<0) {
\r
124 qManager->AddSelect(qc, qDraw);
\r
126 qManager->RemoveSelect(qDraw);
\r
127 qManager->AddSelect(qc, qDraw);
\r
130 //---------------------------------------------------------------------------
\r
132 TFMain::PutCircuit(int mx, int my) {
\r
133 FParam->CreateCircuit(FCPanel->GetCircuit(),mx,my,qDraw,qManager);
\r
134 qManager->DrawAll(qDraw);
\r
137 //---------------------------------------------------------------------------
\r
139 TFMain::ModifyCircuit(void) {
\r
141 qManager->RemoveSelect(qDraw);
\r
142 int mx = qDraw->GetPosX(MX);
\r
143 int my = qDraw->GetPosY(MY);
\r
145 QCircuit *qc = qManager->GetCircuitInclude(mx, my);
\r
150 FParam->ModifyCircuit(qc,qManager);
\r
151 qManager->DrawAll(qDraw);
\r
154 //---------------------------------------------------------------------------
\r
156 TFMain::WMDropFiles(TWMDropFiles &Msg) {
\r
160 SetForegroundWindow(Handle);
\r
162 char filename[MAX_PATH+1];
\r
163 int FileNum = DragQueryFile((void*)Msg.Drop,-1,NULL,0);
\r
165 ShowMessage("QCAD does not support multi-file drop.");
\r
169 DragQueryFile((void*)Msg.Drop,0,filename,sizeof(filename));
\r
170 DragFinish((void*)Msg.Drop);
\r
172 AnsiString FileName = filename;
\r
173 AnsiString Ext = ExtractFileExt(FileName);
\r
175 if (Ext == ".qdt") {
\r
176 ImportResult(FileName.c_str());
\r
177 } else if (Ext == ".qcd") {
\r
178 OpenFile(FileName.c_str());
\r
180 ShowMessage("QCAD does not support this file type.");
\r
183 //---------------------------------------------------------------------------
\r
187 * true : File is saved
\r
188 * false : File is not saved(Canceled)
\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
200 FileName = SaveDialog->FileName;
\r
202 qManager->SaveToFile(FileName.c_str());
\r
206 //---------------------------------------------------------------------------
\r
210 * true: One can proceed.
\r
211 * false: Process is canceled.
\r
214 TFMain::SaveQuery(void) {
\r
215 if (!qManager->IsModified()) {
\r
219 int r = MessageBox(Handle, "File is modified, save it before quit?","QCAD - Alert",MB_YESNOCANCEL);
\r
223 } else if (r == IDNO) {
\r
228 //---------------------------------------------------------------------------
\r
230 TFMain::ImportResult(char *FileName) {
\r
232 qBits->LoadFromFile(FileName);
\r
233 qManager->CalcAll(qBits);
\r
236 FGraph->Execute(qBits);
\r
238 //---------------------------------------------------------------------------
\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
246 //---------------------------------------------------------------------------
\r
248 //---------------------------------------------------------------------------
\r
253 TFMain::MMNewClick(TObject *Sender) {
\r
254 if (!SaveQuery()) {
\r
257 if (!FNew->Execute(qManager->GetLineNumber(),qManager->GetColumnNumber())) {
\r
261 ChangeSize(FNew->GetLineNumber(),FNew->GetColumnNumber());
\r
262 qManager->Init(FNew->GetLineNumber(),FNew->GetColumnNumber());
\r
263 qManager->DrawAll(qDraw);
\r
266 //---------------------------------------------------------------------------
\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
277 OpenFile(OpenDialog->FileName);
\r
279 //---------------------------------------------------------------------------
\r
284 TFMain::MMSaveClick(TObject *Sender) {
\r
287 //---------------------------------------------------------------------------
\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
299 qManager->SetFileName(SaveDialog->FileName.c_str());
\r
302 //---------------------------------------------------------------------------
\r
307 TFMain::MMSaveAsPSClick(TObject *Sender) {
\r
309 SaveDialog->Filter = "PostScriptFiles(*.eps)|*.eps|All Files(*.*)|*.*";
\r
310 SaveDialog->DefaultExt = "eps";
\r
311 SaveDialog->FileName = "";
\r
312 if (!SaveDialog->Execute()) {
\r
315 qManager->SaveAsEPS(SaveDialog->FileName.c_str());
\r
317 //---------------------------------------------------------------------------
\r
319 * Save as Bitmap File
\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
329 Image->Picture->Bitmap->HandleType = bmDIB;
\r
330 Image->Picture->Bitmap->PixelFormat = pf8bit;
\r
331 Image->Picture->Bitmap->SaveToFile(SaveDialog->FileName);
\r
333 //---------------------------------------------------------------------------
\r
335 TFMain::MMCircuitPanelClick(TObject *Sender) {
\r
338 //---------------------------------------------------------------------------
\r
340 TFMain::MMPrintClick(TObject *Sender) {
\r
342 if (!PrintDialog->Execute())return;
\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
350 QDraw *qPrintDraw = new QDraw(p->Canvas);
\r
351 p->Orientation = poLandscape;
\r
353 if (gridx < gridy) {
\r
354 qPrintDraw->SetGridSize(gridx);
\r
356 qPrintDraw->SetGridSize(gridy);
\r
358 qManager->DrawAllPrinter(qPrintDraw);
\r
363 //---------------------------------------------------------------------------
\r
365 TFMain::MMPrintSetupClick(TObject *Sender) {
\r
367 TPrinter *p = Printer();
\r
368 p->Orientation = poLandscape;
\r
370 if (!PrinterSetupDialog->Execute()) {
\r
374 //---------------------------------------------------------------------------
\r
376 TFMain::MMExitClick(TObject *Sender) {
\r
379 //---------------------------------------------------------------------------
\r
381 TFMain::MMUndoClick(TObject *Sender) {
\r
382 qManager->Undo(qDraw);
\r
385 //---------------------------------------------------------------------------
\r
390 TFMain::MMRemoveClick(TObject *Sender) {
\r
391 qManager->RemoveSelectedCircuits(qDraw);
\r
394 //---------------------------------------------------------------------------
\r
396 TFMain::MMRunClick(TObject *Sender) {
\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
404 if (r == IDNO)return;
\r
407 qBits->Allocate(qManager->GetLineNumber());
\r
408 qManager->CalcAll(qBits);
\r
410 FGraph->Execute(qBits);
\r
412 //---------------------------------------------------------------------------
\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
420 char *FileName = OpenDialog->FileName.c_str();
\r
421 ImportResult(FileName);
\r
423 //---------------------------------------------------------------------------
\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
430 htmlhelp->ShowHtmlHelp(this->Handle,HtmlHelp.c_str());
\r
433 //---------------------------------------------------------------------------
\r
435 TFMain::MMAboutClick(TObject *Sender) {
\r
436 FVersion->ShowModal();
\r
438 //---------------------------------------------------------------------------
\r
440 TFMain::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
\r
444 //---------------------------------------------------------------------------
\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
451 int pos = VertScrollBar->Position;
\r
452 pos -= (int)(WheelDelta*d);
\r
457 if (pos > VertScrollBar->Range) {
\r
458 pos = VertScrollBar->Range;
\r
460 VertScrollBar->Position = pos;
\r
462 //---------------------------------------------------------------------------
\r
464 TFMain::ImageDblClick(TObject *Sender) {
\r
467 //---------------------------------------------------------------------------
\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
475 if (my<0 || my>=qManager->GetLineNumber()) {
\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
487 //---------------------------------------------------------------------------
\r
489 TFMain::FormDeactivate(TObject *Sender) {
\r
490 qManager->RemoveSelect(qDraw);
\r
492 //---------------------------------------------------------------------------
\r
495 TFMain::FormCloseQuery(TObject *Sender, bool &CanClose) {
\r
496 if (!SaveQuery()) {
\r
500 //---------------------------------------------------------------------------
\r
502 TFMain::MMPreViewPrintClick(TObject *Sender) {
\r
503 FPreview->Execute(qManager);
\r
505 //---------------------------------------------------------------------------
\r
507 TFMain::MMShowAllClick(TObject *Sender) {
\r
508 MMShowAll->Checked = true;
\r
510 //---------------------------------------------------------------------------
\r
512 TFMain::MMShowNonZeroClick(TObject *Sender) {
\r
513 MMShowNonZero->Checked = true;
\r
515 //---------------------------------------------------------------------------
\r