summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2013-05-08 16:59:01 -0700
committerRobin Watts <robin.watts@artifex.com>2013-05-16 19:25:53 +0100
commit165a3528f5a48ba9c4f30d18330875b6070ddf96 (patch)
tree1abceb81e34769b2523701622d24923d7350fd9b
parent3824bf32f8595c2f037db14e133b798bfae65027 (diff)
downloadmupdf-165a3528f5a48ba9c4f30d18330875b6070ddf96.tar.xz
Support for going to the links.
Used tag attribute in rectangle object to store the index value into the collection of rectangles to get back the page number or uri.
-rw-r--r--winrt/mupdf_cpp/MainPage.xaml6
-rw-r--r--winrt/mupdf_cpp/MainPage.xaml.cpp106
-rw-r--r--winrt/mupdf_cpp/MainPage.xaml.h5
-rw-r--r--winrt/mupdf_cpp/RectList.h26
4 files changed, 58 insertions, 85 deletions
diff --git a/winrt/mupdf_cpp/MainPage.xaml b/winrt/mupdf_cpp/MainPage.xaml
index 770d8bd3..23413db9 100644
--- a/winrt/mupdf_cpp/MainPage.xaml
+++ b/winrt/mupdf_cpp/MainPage.xaml
@@ -104,7 +104,7 @@
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
- <Rectangle Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}">
+ <Rectangle Name="{Binding Index}" Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Path=X}" Y="{Binding Path=Y}"/>
</Rectangle.RenderTransform>
@@ -127,7 +127,7 @@
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
- <Rectangle Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}">
+ <Rectangle Tag="{Binding Path=Index}" Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}" IsTapEnabled="True" Tapped="LinkTapped">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Path=X}" Y="{Binding Path=Y}"/>
</Rectangle.RenderTransform>
@@ -179,7 +179,7 @@
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
- <Rectangle Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}">
+ <Rectangle Width="{Binding Path=Width}" Height="{Binding Path=Height}" Fill="{Binding Path=Color}" IsTapEnabled="True" Tapped="LinkTapped">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Path=X}" Y="{Binding Path=Y}"/>
</Rectangle.RenderTransform>
diff --git a/winrt/mupdf_cpp/MainPage.xaml.cpp b/winrt/mupdf_cpp/MainPage.xaml.cpp
index d8e97586..60350170 100644
--- a/winrt/mupdf_cpp/MainPage.xaml.cpp
+++ b/winrt/mupdf_cpp/MainPage.xaml.cpp
@@ -656,9 +656,7 @@ void mupdf_cpp::MainPage::RenderRange(int curr_page)
}
m_currpage = curr_page;
if (this->m_links_on)
- {
AddLinkCanvas();
- }
}
void mupdf_cpp::MainPage::Slider_ValueChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::Primitives::RangeBaseValueChangedEventArgs^ e)
@@ -1134,6 +1132,7 @@ void mupdf_cpp::MainPage::AddLinkCanvas()
rect_item->Type = curr_link->Type;
rect_item->Urilink = curr_link->Uri;
rect_item->PageNum = curr_link->PageNum;
+ rect_item->Index = k.ToString();
link_list->Append(rect_item);
}
}
@@ -1148,82 +1147,45 @@ void mupdf_cpp::MainPage::AddLinkCanvas()
m_page_update = false;
}
-bool mupdf_cpp::MainPage::CheckRect(Rectangle^ curr_rect, Point pt)
-{
- TranslateTransform ^trans_transform = (TranslateTransform^) curr_rect->RenderTransform;
- Point rect_start;
- Point rect_end;
-
- rect_start.X = trans_transform->X;
- rect_start.Y = trans_transform->Y;
- rect_end.X = rect_start.X + curr_rect->Width;
- rect_end.Y = rect_start.Y + curr_rect->Height;
- if ((rect_start.X < pt.X) && (pt.X < rect_end.X) && (rect_start.Y < pt.Y) && (pt.Y < rect_end.Y))
- return true;
- return false;
-}
-
-void mupdf_cpp::MainPage::Canvas_Single_Tap(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
+/* A link was tapped */
+void mupdf_cpp::MainPage::LinkTapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e)
{
- /* See if we are currently viewing any links */
- if (m_links_on)
+ Rectangle^ rect = safe_cast<Rectangle^>(e->OriginalSource);
+ String^ str_index = safe_cast<String^>(rect->Tag);
+ int index = _wtof(str_index->Data());
+
+ if (index >= 0 && index < m_num_pages)
{
- Point pt;
- Canvas^ link_canvas = (Canvas^) (m_curr_flipView->FindName("linkCanvas"));
- if (link_canvas != nullptr)
+ auto link_list = m_page_link_list->GetAt(m_currpage);
+ auto link = link_list->GetAt(index);
+
+ if (link->Type == LINK_GOTO)
{
- pt = e->GetPosition(link_canvas);
- IIterator<UIElement^> ^it = link_canvas->Children->First();
- int count = 0;
- while (it->HasCurrent)
- {
- Rectangle^ curr_rect = (Rectangle^) (it->Current);
- if (CheckRect(curr_rect, pt))
- {
- int page = JumpToLink(count);
- if (page >= 0)
- this->m_curr_flipView->SelectedIndex = page;
- return;
- }
- it->MoveNext();
- count += 1;
- }
+ this->m_curr_flipView->SelectedIndex = link->PageNum;
+ }
+ else if (link->Type == LINK_URI)
+ {
+ // Set the option to show a warning
+ auto launchOptions = ref new Windows::System::LauncherOptions();
+ launchOptions->TreatAsUntrusted = true;
+
+ // Launch the URI with a warning prompt
+ concurrency::task<bool> launchUriOperation(Windows::System::Launcher::LaunchUriAsync(link->Urilink, launchOptions));
+ launchUriOperation.then([](bool success)
+ {
+ if (success)
+ {
+ // URI launched
+ }
+ else
+ {
+ // URI launch failed
+ }
+ });
}
}
}
-int mupdf_cpp::MainPage::JumpToLink(int index)
-{
- auto link = mu_doc->GetLink(index);
-
- if (link->Type == LINK_GOTO)
- {
- return link->PageNum;
- }
- else if (link->Type == LINK_URI)
- {
- // Set the option to show a warning
- auto launchOptions = ref new Windows::System::LauncherOptions();
- launchOptions->TreatAsUntrusted = true;
-
- // Launch the URI with a warning prompt
- concurrency::task<bool> launchUriOperation(Windows::System::Launcher::LaunchUriAsync(link->Uri, launchOptions));
- launchUriOperation.then([](bool success)
- {
- if (success)
- {
- // URI launched
- }
- else
- {
- // URI launch failed
- }
- });
- return -1;
- }
- return 0;
-}
-
/* Bring up the contents */
void mupdf_cpp::MainPage::ContentDisplay(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
@@ -1332,3 +1294,5 @@ void mupdf_cpp::MainPage::ScrollChanged(Platform::Object^ sender, Windows::UI::X
int zz = 1;
}
+
+
diff --git a/winrt/mupdf_cpp/MainPage.xaml.h b/winrt/mupdf_cpp/MainPage.xaml.h
index 9c39534e..2c73b67d 100644
--- a/winrt/mupdf_cpp/MainPage.xaml.h
+++ b/winrt/mupdf_cpp/MainPage.xaml.h
@@ -135,8 +135,6 @@ namespace mupdf_cpp
void ReleasePages(int old_page, int new_page);
void Linker(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void AddLinkCanvas();
- void Canvas_Single_Tap(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e);
- bool CheckRect(Rectangle^ curr_rect, Point pt);
int JumpToLink(int index);
void ContentDisplay(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e);
void FlattenOutline(fz_outline *outline, int level);
@@ -152,5 +150,6 @@ namespace mupdf_cpp
void OKInvokedHandler(Windows::UI::Popups::IUICommand^ command);
Point ComputePageSize(spatial_info_t spatial_info, int page_num);
void ScrollChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::ScrollViewerViewChangedEventArgs^ e);
-};
+ void LinkTapped(Platform::Object^ sender, Windows::UI::Xaml::Input::TappedRoutedEventArgs^ e);
+ };
}
diff --git a/winrt/mupdf_cpp/RectList.h b/winrt/mupdf_cpp/RectList.h
index d138397a..d3f0527f 100644
--- a/winrt/mupdf_cpp/RectList.h
+++ b/winrt/mupdf_cpp/RectList.h
@@ -21,19 +21,16 @@ namespace mupdf_cpp
int type;
int pagenum;
Windows::Foundation::Uri ^uri;
+ String^ index; // For identify which rectangle was tapped
public:
RectList(void);
- property int Height
+ property String^ Index
{
- int get() { return ((int) height); }
- void set(int value)
+ String^ get() { return ((String^) index); }
+ void set(String^ value)
{
- if (value < 0)
- {
- throw ref new Platform::InvalidArgumentException();
- }
- height = value;
+ index = value;
}
}
@@ -46,6 +43,19 @@ namespace mupdf_cpp
}
}
+ property int Height
+ {
+ int get() { return ((int) height); }
+ void set(int value)
+ {
+ if (value < 0)
+ {
+ throw ref new Platform::InvalidArgumentException();
+ }
+ height = value;
+ }
+ }
+
property int Width
{
int get() { return width; }