//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Main.h" #include "Settings.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "Winsoft.FireMonkey.PDFium" #pragma resource "*.fmx" TFormMain *FormMain; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonOpenPdfClick(TObject *Sender) { if (OpenDialog->Execute()) { Selecting = false; SelectionStart = -1; SelectionEnd = -1; SpeedButtonSaveAs->Enabled = false; SpeedButtonSaveBitmap->Enabled = false; SpeedButtonPrint->Enabled = false; SpeedButtonShowInfo->Enabled = false; SpeedButtonShowText->Enabled = false; SpeedButtonFirstPage->Enabled = false; SpeedButtonPreviousPage->Enabled = false; SpeedButtonPageNumber->Enabled = false; SpeedButtonPageNumber->Text = ""; SpeedButtonNextPage->Enabled = false; SpeedButtonLastPage->Enabled = false; SpeedButtonZoomOut->Enabled = false; SpeedButtonZoomIn->Enabled = false; ComboBoxZoom->Enabled = false; SpeedButtonRotateLeft->Enabled = false; SpeedButtonRotateRight->Enabled = false; SpeedButtonSettings->Enabled = false; SpeedButtonSearch->Enabled = false; EditSearch->Enabled = false; TreeViewBookmarks->Visible = false; Splitter->Visible = false; FPdfView->Enabled = false; FPdf->Active = false; FPdf->FileName = OpenDialog->FileName; FPdf->Password = ""; FPdfView->PageNumber = 1; try { FPdfView->Active = true; FPdfView->Enabled = true; } catch (EPdfError &error) { if (error.Message == "Password required or incorrect password") { UnicodeString Password = ""; if (!InputQuery("Enter Password", "Password: ", Password)) throw; FPdf->Password = Password; FPdfView->Active = true; FPdfView->Enabled = true; } else throw; } TBookmarks Bookmarks = FPdf->Bookmarks; TreeViewBookmarks->Clear(); for (int I = 0; I < Bookmarks.Length; ++I) { TTreeViewItem *Node = new TTreeViewItem(TreeViewBookmarks); Node->Text = Bookmarks[I].Title; Node->Tag = Bookmarks[I].PageNumber; TreeViewBookmarks->AddObject(Node); AddChildBookmarks(Node, Bookmarks[I]); } if (TreeViewBookmarks->Count > 0) { Splitter->Visible = true; TreeViewBookmarks->Visible = true; } ScrollBox->ScrollBy(MaxInt, MaxInt); } } //--------------------------------------------------------------------------- void __fastcall TFormMain::AddChildBookmarks(TTreeViewItem *BookmarkNode, TBookmark Bookmark) { TBookmarks Bookmarks = FPdf->BookmarkChildren[Bookmark]; for (int I = 0; I < Bookmarks.Length; ++I) { TTreeViewItem *Node = new TTreeViewItem(BookmarkNode); Node->Text = Bookmarks[I].Title; Node->Tag = Bookmarks[I].PageNumber; BookmarkNode->AddObject(Node); AddChildBookmarks(Node, Bookmarks[I]); } } //--------------------------------------------------------------------------- TTreeViewItem *FindBookmark(TTreeViewItem *Item, int PageNumber) { if (Item->Tag >= PageNumber) return Item; else for (int I = 0; I < Item->Count; ++I) { TTreeViewItem *Result = FindBookmark(Item->Items[I], PageNumber); if (Result != NULL) return Result; } return NULL; } //--------------------------------------------------------------------------- TTreeViewItem *PreviousItem(TTreeViewItem *ParentItem, TTreeViewItem *Item) { for (int I = 0; I < ParentItem->Count; ++I) if (ParentItem->Items[I] == Item) if (I == 0) return ParentItem; else { TTreeViewItem *Result = ParentItem->Items[I - 1]; while (Result->Count > 0) Result = Result->Items[Result->Count - 1]; return Result; } return Item; } //--------------------------------------------------------------------------- TTreeViewItem *PreviousItem(TTreeView *Parent, TTreeViewItem *Item) { for (int I = 0; I < Parent->Count; ++I) if (Parent->Items[I] == Item) if (I == 0) return Item; else { TTreeViewItem *Result = Parent->Items[I - 1]; while (Result->Count > 0) Result = Result->Items[Result->Count - 1]; return Result; } return Item; } //--------------------------------------------------------------------------- TTreeViewItem *FindBookmark(TTreeView *TreeView, int PageNumber) { TTreeViewItem *Result = NULL; for (int I = 0; I < TreeView->Count; ++I) { Result = FindBookmark(TreeView->Items[I], PageNumber); if (Result != NULL) break; } if (Result != NULL) if (Result->Tag > PageNumber) if (Result->ParentItem() != NULL) Result = PreviousItem(Result->ParentItem(), Result); else Result = PreviousItem(TreeView, Result); return Result; } //--------------------------------------------------------------------------- void __fastcall TFormMain::FPdfViewPageChange(TObject *Sender) { if (FPdfView->Active) { SpeedButtonSaveAs->Enabled = true; SpeedButtonSaveBitmap->Enabled = true; SpeedButtonPrint->Enabled = true; SpeedButtonShowInfo->Enabled = true; SpeedButtonShowText->Enabled = true; SpeedButtonFirstPage->Enabled = FPdfView->PageNumber > 1; SpeedButtonPreviousPage->Enabled = FPdfView->PageNumber > 1; SpeedButtonPageNumber->Enabled = FPdfView->PageCount > 1; SpeedButtonPageNumber->Text = IntToStr(FPdfView->PageNumber) + " of " + IntToStr(FPdfView->PageCount); SpeedButtonNextPage->Enabled = FPdfView->PageNumber < FPdfView->PageCount; SpeedButtonLastPage->Enabled = FPdfView->PageNumber < FPdfView->PageCount; SpeedButtonZoomOut->Enabled = true; SpeedButtonZoomIn->Enabled = true; ComboBoxZoom->Enabled = true; SpeedButtonRotateLeft->Enabled = true; SpeedButtonRotateRight->Enabled = true; SpeedButtonSettings->Enabled = true; SpeedButtonSearch->Enabled = EditSearch->Text.Length() > 0; EditSearch->Enabled = True; } else { SpeedButtonSaveAs->Enabled = false; SpeedButtonSaveBitmap->Enabled = false; SpeedButtonPrint->Enabled = false; SpeedButtonShowInfo->Enabled = false; SpeedButtonShowText->Enabled = false; SpeedButtonFirstPage->Enabled = false; SpeedButtonPreviousPage->Enabled = false; SpeedButtonPageNumber->Enabled = false; SpeedButtonPageNumber->Text = ""; SpeedButtonNextPage->Enabled = false; SpeedButtonLastPage->Enabled = false; SpeedButtonZoomOut->Enabled = false; SpeedButtonZoomIn->Enabled = false; ComboBoxZoom->Enabled = false; SpeedButtonRotateLeft->Enabled = false; SpeedButtonRotateRight->Enabled = false; SpeedButtonSettings->Enabled = false; SpeedButtonSearch->Enabled = false; EditSearch->Enabled = false; } Selecting = false; SelectionStart = -1; SelectionEnd = -1; SearchStart = -1; SearchEnd = -1; Zoom(); FPdfView->Repaint(); // update bookmark if (!DisableBookmarks) { TTreeViewItem *Node = FindBookmark(TreeViewBookmarks, FPdfView->PageNumber); if (Node != NULL) TreeViewBookmarks->Selected = Node; else TreeViewBookmarks->Selected = NULL; } } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonShowInfoClick(TObject *Sender) { #define NewLine "\xd\xa" ShowMessage( "Author: " + FPdf->Author + NewLine + "Creator: " + FPdf->Creator + NewLine + "Keywords: " + FPdf->Keywords + NewLine + "Producer: " + FPdf->Producer + NewLine + "Subject: " + FPdf->Subject + NewLine + "Title: " + FPdf->Title + NewLine + "Creation date: " + FPdf->CreationDate + NewLine + "Modified date: " + FPdf->ModifiedDate); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonShowTextClick(TObject *Sender) { ShowMessage(FPdfView->Text()); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonFirstPageClick(TObject *Sender) { FPdfView->PageNumber = 1; } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonPreviousPageClick(TObject *Sender) { FPdfView->PageNumber -= 1; } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonNextPageClick(TObject *Sender) { FPdfView->PageNumber += 1; } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonLastPageClick(TObject *Sender) { FPdfView->PageNumber = FPdfView->PageCount; } //--------------------------------------------------------------------------- void __fastcall TFormMain::FormCreate(TObject *Sender) { _di_IDeviceBehavior DeviceBehavior; PixelsPerInch = 96; if (TBehaviorServices::Current->SupportsBehaviorService(__uuidof(IDeviceBehavior), &DeviceBehavior, this)) PixelsPerInch = DeviceBehavior->GetDisplayMetrics(this).PixelsPerInch; TreeViewBookmarks->Visible = false; Splitter->Visible = false; } //--------------------------------------------------------------------------- void __fastcall TFormMain::Zoom() { if (FPdfView->Active) { double Zoom, PdfPageWidth, PdfPageHeight; if ((FPdfView->Rotation == ro0) || (FPdfView->Rotation == ro180)) { PdfPageWidth = FPdfView->PageWidth; PdfPageHeight = FPdfView->PageHeight; } else { PdfPageWidth = FPdfView->PageHeight; PdfPageHeight = FPdfView->PageWidth; } switch (ComboBoxZoom->ItemIndex) { case 0: Zoom = 0.1; break; case 1: Zoom = 0.25; break; case 2: Zoom = 0.5; break; case 3: Zoom = 0.75; break; case 5: Zoom = 1.25; break; case 6: Zoom = 1.5; break; case 7: Zoom = 2.0; break; case 8: Zoom = 4.0; break; case 10: // Zoom to page if (ScrollBox->Width / PdfPageWidth > ScrollBox->Height / PdfPageHeight) Zoom = ScrollBox->Height / PointsToPixels(PdfPageHeight, PixelsPerInch); // zoom to height else Zoom = ScrollBox->Width / PointsToPixels(PdfPageWidth, PixelsPerInch); // zoom to width break; case 11: // Zoom to page width Zoom = (ScrollBox->Width - 24) / PointsToPixels(PdfPageWidth, PixelsPerInch); break; default: Zoom = 1.0; break; } // set page size FPdfView->Size->Size = TSizeF( PointsToPixels(Zoom * PdfPageWidth, PixelsPerInch), PointsToPixels(Zoom * PdfPageHeight, PixelsPerInch)); // update zoom buttons visibility SpeedButtonZoomOut->Enabled = (ComboBoxZoom->ItemIndex > 0) && (ComboBoxZoom->ItemIndex < 9); SpeedButtonZoomIn->Enabled = ComboBoxZoom->ItemIndex < 8; } } //--------------------------------------------------------------------------- void __fastcall TFormMain::FormResize(TObject *Sender) { Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonSaveAsClick(TObject *Sender) { SaveDialog->FileName = "document.pdf"; if (SaveDialog->Execute()) FPdf->SaveAs(SaveDialog->FileName); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonSaveBitmapClick(TObject *Sender) { if (SavePictureDialog->Execute()) { TBitmap *Bitmap = FPdfView->RenderPage(0, 0, FPdfView->Width, FPdfView->Height, FPdfView->Rotation, FPdfView->Options); try { Bitmap->SaveToFile(SavePictureDialog->FileName); } __finally { delete Bitmap; } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonPrintClick(TObject *Sender) { if ((FPdfView->Rotation == ro0) || (FPdfView->Rotation == ro180)) Fmx::Printer::Printer()->Orientation = TPrinterOrientation::poPortrait; else Fmx::Printer::Printer()->Orientation = TPrinterOrientation::poLandscape; PrintDialog->MinPage = 1; PrintDialog->MaxPage = FPdf->PageCount; PrintDialog->Options = TPrintDialogOptions() << TPrintDialogOption::poPageNums; PrintDialog->FromPage = FPdfView->PageNumber; PrintDialog->ToPage = FPdfView->PageNumber; PrintDialog->PrintRange = TPrintRange::prPageNums; PrintDialog->Copies = 1; if (PrintDialog->Execute()) { int FromPage, ToPage; if (PrintDialog->PrintRange == TPrintRange::prPageNums) { FromPage = PrintDialog->FromPage; ToPage = PrintDialog->ToPage; } else { FromPage = 1; ToPage = FPdf->PageCount; } int CopyCount, CollateCopyCount; if (PrintDialog->Collate) { CollateCopyCount = PrintDialog->Copies; CopyCount = 1; } else { CollateCopyCount = 1; CopyCount = PrintDialog->Copies; } if (FPdf->Title.Length() > 0) Fmx::Printer::Printer()->Title = FPdf->Title; else Fmx::Printer::Printer()->Title = Caption; bool FirstPage = true; Fmx::Printer::Printer()->BeginDoc(); try { Cancel = false; ProgressBar->Max = (ToPage - FromPage + 1) * PrintDialog->Copies; ProgressBar->Value = 0; ToolBarButtons->Visible = false; ToolBarCancel->Visible = true; for (int CollateCopy = 1; CollateCopy <= CollateCopyCount; ++CollateCopy) for (int Page = FromPage; Page <= ToPage; ++Page) for (int Copy = 1; Copy <= CopyCount; ++Copy) { if (FirstPage) FirstPage = false; else Fmx::Printer::Printer()->NewPage(); ++ProgressBar->Value; FPdf->PageNumber = Page; TBitmap *Bitmap = FPdfView->RenderPage(0, 0, Fmx::Printer::Printer()->PageWidth, Fmx::Printer::Printer()->PageHeight, FPdfView->Rotation, TRenderOptions() << TRenderOption::rePrinting); try { TRectF R = TRectF(0, 0, Fmx::Printer::Printer()->PageWidth, Fmx::Printer::Printer()->PageHeight); Fmx::Printer::Printer()->Canvas->DrawBitmap(Bitmap, R, R, 1.0, true); } __finally { delete Bitmap; } Application->ProcessMessages(); if (Cancel) { CollateCopyCount = 0; ToPage = 0; CopyCount = 0; } } } __finally { ToolBarCancel->Visible = false; ToolBarButtons->Visible = true; Fmx::Printer::Printer()->EndDoc(); } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonPageNumberClick(TObject *Sender) { UnicodeString PageNumber = IntToStr(FPdfView->PageNumber); if (InputQuery("Select page", "Page number: ", PageNumber)) { int NewPageNumber = StrToIntDef(PageNumber, FPdfView->PageNumber); if ((NewPageNumber >= 1) && (NewPageNumber <= FPdfView->PageCount)) FPdfView->PageNumber = NewPageNumber; } } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonZoomOutClick(TObject *Sender) { ComboBoxZoom->ItemIndex -= 1; Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonZoomInClick(TObject *Sender) { ComboBoxZoom->ItemIndex += 1; Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::ScrollBoxResize(TObject *Sender) { Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonRotateLeftClick(TObject *Sender) { switch (FPdfView->Rotation) { case ro0: FPdfView->Rotation = ro270; break; case ro90: FPdfView->Rotation = ro0; break; case ro180: FPdfView->Rotation = ro90; break; case ro270: FPdfView->Rotation = ro180; break; } Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonRotateRightClick(TObject *Sender) { switch (FPdfView->Rotation) { case ro0: FPdfView->Rotation = ro90; break; case ro90: FPdfView->Rotation = ro180; break; case ro180: FPdfView->Rotation = ro270; break; case ro270: FPdfView->Rotation = ro0; break; } Zoom(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::ComboBoxZoomChange(TObject *Sender) { Zoom(); ScrollBox->ScrollBy(MaxInt, MaxInt); } //--------------------------------------------------------------------------- void __fastcall OSExecute(const UnicodeString ACommand) { #ifdef MSWINDOWS ShellExecute(0, L"OPEN", ACommand.w_str(), NULL, NULL, SW_SHOWNORMAL); #endif #ifdef POSIX _system(PAnsiChar("open " + (AnsiString)ACommand)); #endif } //--------------------------------------------------------------------------- bool IsAlphaNumeric(WideChar c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); } //--------------------------------------------------------------------------- void __fastcall TFormMain::FPdfViewMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { int LinkIndex = FPdfView->WebLinkAtPos(X, Y); if (LinkIndex != -1) { OSExecute(FPdfView->WebLink[LinkIndex].Url); return; } LinkIndex = FPdfView->LinkAnnotationAtPos(X, Y); if (LinkIndex != -1) { TLinkAnnotation LinkAnnotation = FPdfView->LinkAnnotation[LinkIndex]; switch (LinkAnnotation.Action) { case acGotoRemote: case acLaunch: case acUri: OSExecute(LinkAnnotation.ActionPath); break; default: if ((LinkAnnotation.PageNumber >= 1) && (LinkAnnotation.PageNumber <= FPdfView->PageCount)) FPdfView->PageNumber = LinkAnnotation.PageNumber; break; } return; } if (Shift.Contains(ssDouble)) { const double Tolerance = 2.0; // select current word SelectionStart = FPdfView->CharacterIndexAtPos(X, Y, Tolerance, Tolerance); SelectionEnd = SelectionStart; if (SelectionStart >= 0) { while ((SelectionStart > 0) && IsAlphaNumeric(FPdfView->Character[SelectionStart - 1])) --SelectionStart; while ((SelectionEnd < FPdfView->CharacterCount - 1) && IsAlphaNumeric(FPdfView->Character[SelectionEnd + 1])) ++SelectionEnd; FPdfView->Repaint(); } } else { Selecting = true; SelectionStart = -1; SelectionEnd = -1; } } //--------------------------------------------------------------------------- void __fastcall TFormMain::FPdfViewMouseMove(TObject *Sender, TShiftState Shift, float X, float Y) { double Tolerance = 2.0; int SelectedIndex = FPdfView->CharacterIndexAtPos(X, Y, Tolerance, Tolerance); if (!Selecting && (FPdfView->WebLinkAtPos(X, Y) != -1)) FPdfView->Cursor = crHandPoint; else if ((!Selecting) && (FPdfView->LinkAnnotationAtPos(X, Y) != -1)) FPdfView->Cursor = crHandPoint; else if (SelectedIndex >= 0) FPdfView->Cursor = crIBeam; else FPdfView->Cursor = crDefault; if (Selecting) if (SelectedIndex >= 0) { bool NeedRepaint = false; if (SelectionStart == -1) { SelectionStart = SelectedIndex; NeedRepaint = true; } if (SelectionEnd != SelectedIndex) { SelectionEnd = SelectedIndex; NeedRepaint = true; } if (NeedRepaint) FPdfView->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TFormMain::FPdfViewMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, float X, float Y) { if (Selecting) { Selecting = false; if ((SelectionStart >= 0) && (SelectionEnd >= 0)) { UnicodeString Text; if (SelectionEnd < SelectionStart) Text = FPdfView->Text(SelectionEnd, SelectionStart - SelectionEnd + 1); else Text = FPdfView->Text(SelectionStart, SelectionEnd - SelectionStart + 1); if (TPlatformServices::Current->SupportsPlatformService(__uuidof(IFMXClipboardService))) { _di_IFMXClipboardService Clipboard = TPlatformServices::Current->GetPlatformService(__uuidof(IFMXClipboardService)); Clipboard->SetClipboard(TValue::From(Text)); } } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::FPdfViewPaint(TObject *Sender, TCanvas *Canvas) { if (FPdfView->Enabled) { FPdfView->PaintSelection(SelectionStart, SelectionEnd, TAlphaColor(0x8080C0F0)); FPdfView->PaintSelection(SearchStart, SearchEnd, TAlphaColor(0x8000E000)); } } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonSettingsClick(TObject *Sender) { TFormSettings *formSettings = new TFormSettings(NULL); try { formSettings->CheckBoxShowAnnotations->IsChecked = FPdfView->Options.Contains(reAnnotations); formSettings->CheckBoxOptimizeForLcdDisplay->IsChecked = FPdfView->Options.Contains(reLcd); formSettings->CheckBoxNativeTextOutput->IsChecked = !FPdfView->Options.Contains(reNoNativeText); formSettings->CheckBoxGrayscaleOutput->IsChecked = FPdfView->Options.Contains(reGrayscale); formSettings->CheckBoxLimitImageCacheSize->IsChecked = FPdfView->Options.Contains(reLimitCache); formSettings->CheckBoxUseHalftoneForImageStretching->IsChecked = FPdfView->Options.Contains(reHalftone); formSettings->CheckBoxRenderForPrinting->IsChecked = FPdfView->Options.Contains(rePrinting); formSettings->CheckBoxReverseByteOrder->IsChecked = FPdfView->Options.Contains(reReverseByteOrder); formSettings->CheckBoxAntiAliasingOnText->IsChecked = !FPdfView->Options.Contains(reNoSmoothText); formSettings->CheckBoxAntiAliasingOnImages->IsChecked = !FPdfView->Options.Contains(reNoSmoothImage); formSettings->CheckBoxAntiAliasingOnPaths->IsChecked = !FPdfView->Options.Contains(reNoSmoothPath); if (formSettings->ShowModal() == mrOk) { TRenderOptions options = TRenderOptions(); if (formSettings->CheckBoxShowAnnotations->IsChecked) options << reAnnotations; if (formSettings->CheckBoxOptimizeForLcdDisplay->IsChecked) options << reLcd; if (!formSettings->CheckBoxNativeTextOutput->IsChecked) options << reNoNativeText; if (formSettings->CheckBoxGrayscaleOutput->IsChecked) options << reGrayscale; if (formSettings->CheckBoxLimitImageCacheSize->IsChecked) options << reLimitCache; if (formSettings->CheckBoxUseHalftoneForImageStretching->IsChecked) options << reHalftone; if (formSettings->CheckBoxRenderForPrinting->IsChecked) options << rePrinting; if (formSettings->CheckBoxReverseByteOrder->IsChecked) options << reReverseByteOrder; if (!formSettings->CheckBoxAntiAliasingOnText->IsChecked) options << reNoSmoothText; if (!formSettings->CheckBoxAntiAliasingOnImages->IsChecked) options << reNoSmoothImage; if (!formSettings->CheckBoxAntiAliasingOnPaths->IsChecked) options << reNoSmoothPath; FPdfView->Options = options; } } __finally { delete formSettings; } } //--------------------------------------------------------------------------- void __fastcall TFormMain::FormKeyUp(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift) { if (Key == vkLeft || Key == vkRight || Key == vkHome || Key == vkEnd) if (EditSearch->IsFocused) return; switch (Key) { case vkPrior: case vkUp: case vkLeft: { if (SpeedButtonPreviousPage->Enabled) SpeedButtonPreviousPageClick(NULL); Key = 0; break; } case vkNext: case vkDown: case vkRight: { if (SpeedButtonNextPage->Enabled) SpeedButtonNextPageClick(NULL); Key = 0; break; } case vkHome: { if (SpeedButtonFirstPage->Enabled) SpeedButtonFirstPageClick(NULL); Key = 0; break; } case vkEnd: { if (SpeedButtonLastPage->Enabled) SpeedButtonLastPageClick(NULL); Key = 0; break; } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::TreeViewBookmarksClick(TObject *Sender) { if (FPdfView->Active) if (TreeViewBookmarks->Selected != NULL) { int PageNumber = TreeViewBookmarks->Selected->Tag; if ((PageNumber >= 1) && (PageNumber <= FPdfView->PageCount)) try { DisableBookmarks = true; FPdfView->PageNumber = PageNumber; } __finally { DisableBookmarks = false; } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::EditSearchChangeTracking(TObject *Sender) { if (SearchStart != -1) { SearchStart = -1; SearchEnd = -1; FPdfView->Repaint(); } SpeedButtonSearch->Enabled = EditSearch->Text.Length() > 0; } //--------------------------------------------------------------------------- void __fastcall TFormMain::SpeedButtonSearchClick(TObject *Sender) { if (EditSearch->Text.Length() > 0) { Cancel = false; ProgressBar->Max = FPdf->PageCount - FPdfView->PageNumber; ProgressBar->Value = 0; ToolBarButtons->Visible = false; ToolBarCancel->Visible = true; try { int FoundIndex; FPdf->PageNumber = FPdfView->PageNumber; if (SearchStart == -1) FoundIndex = FPdf->FindFirst(EditSearch->Text, TSearchOptions()); else FoundIndex = FPdf->FindNext(); SearchStart = -1; SearchEnd = -1; while ((FoundIndex == -1) && (FPdf->PageNumber < FPdf->PageCount)) { ++ProgressBar->Value; Application->ProcessMessages(); if (Cancel) break; ++FPdf->PageNumber; FoundIndex = FPdf->FindFirst(EditSearch->Text, TSearchOptions()); } if (FoundIndex != -1) { FPdfView->PageNumber = FPdf->PageNumber; SearchStart = FoundIndex; SearchEnd = FoundIndex + EditSearch->Text.Length() - 1; FPdfView->Repaint(); } else { FPdfView->Repaint(); if (!Cancel) ShowMessage("Not found"); } } __finally { ToolBarCancel->Visible = false; ToolBarButtons->Visible = true; } } } //--------------------------------------------------------------------------- void __fastcall TFormMain::ButtonCancelClick(TObject *Sender) { Cancel = true; } //---------------------------------------------------------------------------