2009-06-18 17:19:06 +00:00
/ *
Embroidery Reader - an application to view . pes embroidery designs
2016-02-18 23:26:56 +00:00
Copyright ( C ) 2016 Nathan Crawford
2009-06-18 17:19:06 +00:00
This program is free software ; you can redistribute it and / or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation ; either version 2
of the License , or ( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA
02111 - 1307 , USA .
A copy of the full GPL 2 license can be found in the docs directory .
2010-01-23 02:59:33 +00:00
You can contact me at http : //www.njcrawford.com/contact
2009-06-18 17:19:06 +00:00
* /
using System ;
using System.Drawing ;
using System.Windows.Forms ;
using System.Reflection ;
2015-04-17 03:20:19 +00:00
using System.Drawing.Imaging ;
using System.Drawing.Drawing2D ;
2009-06-18 17:19:06 +00:00
namespace embroideryReader
{
public partial class frmMain : Form
{
private string [ ] args ;
private Pen drawPen = Pens . Black ;
private Bitmap DrawArea ;
private PesFile . PesFile design ;
2010-01-23 02:59:33 +00:00
private EmbroideryReaderSettings settings = new EmbroideryReaderSettings ( ) ;
2009-06-18 17:19:06 +00:00
2010-01-23 02:59:33 +00:00
private const String APP_TITLE = "Embroidery Reader" ;
2009-08-17 18:56:13 +00:00
2013-12-07 06:28:04 +00:00
private Translation translation ;
2009-06-18 17:19:06 +00:00
2015-04-17 03:20:19 +00:00
private float designScale = 1.0f ;
2015-04-03 06:09:59 +00:00
private Size panel2LastUpdateSize ;
private bool maximizeChanged = false ;
2015-04-17 03:20:19 +00:00
private int designRotation = 0 ;
2015-04-17 03:31:15 +00:00
private string loadedFileName = "" ;
2015-04-03 06:09:59 +00:00
2009-06-18 17:19:06 +00:00
public frmMain ( )
{
InitializeComponent ( ) ;
args = Environment . GetCommandLineArgs ( ) ;
}
private void checkSettings ( )
{
2013-12-11 00:33:45 +00:00
if ( settings . backgroundColorEnabled )
{
panel2 . BackColor = settings . backgroundColor ;
}
else
{
panel2 . BackColor = Color . FromKnownColor ( KnownColor . Control ) ;
}
2016-01-12 00:50:02 +00:00
if ( settings . windowMaximized )
{
// Check maximized first
this . WindowState = FormWindowState . Maximized ;
}
else
{
// Not maximized, restore last saved window size
this . Width = settings . windowWidth ;
this . Height = settings . windowHeight ;
}
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 1.0f , settings . AutoScaleDesign , false ) ;
2009-06-18 17:19:06 +00:00
}
private void Form1_Load ( object sender , EventArgs e )
{
2016-02-24 04:40:21 +00:00
// Set app window title
2010-01-23 02:59:33 +00:00
this . Text = APP_TITLE ;
2016-02-24 04:40:21 +00:00
// Load and check settings
checkSettings ( ) ;
// Load translation
loadTranslatedStrings ( settings . translation ) ;
// Load design, if specified
2009-06-18 17:19:06 +00:00
if ( args . Length > 1 )
{
openFile ( args [ 1 ] ) ;
}
}
2016-03-22 22:48:12 +00:00
// WndProc values
// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx for more info
const int WM_SYSCOMMAND = 0x0112 ;
const int SC_MAXIMIZE = 0xF030 ;
const int SC_MINIMIZE = 0xF020 ;
const int SC_RESTORE = 0xF120 ;
const int SC_WPARAM_MASK = 0xFFF0 ;
2015-04-03 06:09:59 +00:00
// Override WndProc to capture maximize and restore events
protected override void WndProc ( ref Message m )
{
2016-03-22 22:48:12 +00:00
if ( m . Msg = = WM_SYSCOMMAND )
2015-04-03 06:09:59 +00:00
{
// Check your window state here
2016-03-22 22:48:12 +00:00
int maskedWParam = m . WParam . ToInt32 ( ) & SC_WPARAM_MASK ;
if ( maskedWParam = = SC_MAXIMIZE | |
maskedWParam = = SC_MINIMIZE | |
maskedWParam = = SC_RESTORE )
2015-04-03 06:09:59 +00:00
{
maximizeChanged = true ;
}
}
base . WndProc ( ref m ) ;
}
2009-06-18 17:19:06 +00:00
public static bool checkColorFromStrings ( string red , string green , string blue )
{
byte redByte ;
byte greenByte ;
byte blueByte ;
bool retval = false ;
if ( String . IsNullOrEmpty ( red ) | | String . IsNullOrEmpty ( green ) | | String . IsNullOrEmpty ( blue ) )
{
retval = false ;
}
else
{
try
{
redByte = Convert . ToByte ( red ) ;
greenByte = Convert . ToByte ( green ) ;
blueByte = Convert . ToByte ( blue ) ;
retval = true ;
}
catch ( Exception ex )
{
#if DEBUG
Console . WriteLine ( ex . Message ) ;
# endif
retval = false ;
}
}
return retval ;
}
public static Color makeColorFromStrings ( string red , string green , string blue )
{
if ( checkColorFromStrings ( red , green , blue ) )
{
return Color . FromArgb ( Convert . ToByte ( red ) , Convert . ToByte ( green ) , Convert . ToByte ( blue ) ) ;
}
else
{
return Color . Red ;
}
}
2013-12-07 00:05:15 +00:00
private void updateDesignImage ( )
{
2015-12-22 02:09:57 +00:00
if ( design = = null )
{
// No design loaded - nothing to update
return ;
}
2015-04-17 03:20:19 +00:00
Bitmap tempImage = design . designToBitmap ( ( float ) settings . threadThickness , ( settings . filterStiches ) , settings . filterStitchesThreshold , 1.0f ) ;
// Rotate image
switch ( designRotation )
{
case 90 :
tempImage . RotateFlip ( RotateFlipType . Rotate90FlipNone ) ;
break ;
case 180 :
tempImage . RotateFlip ( RotateFlipType . Rotate180FlipNone ) ;
break ;
case 270 :
tempImage . RotateFlip ( RotateFlipType . Rotate270FlipNone ) ;
break ;
}
// Scale image
if ( fitToWindowToolStripMenuItem . Checked )
{
// Calculate size of image based on available drawing area
float windowWidth = panel2 . Width - 3 ;
float windowHeight = panel2 . Height - 3 ;
// Figure out which dimension is more constrained
float widthScale = windowWidth / tempImage . Width ;
float heightScale = windowHeight / tempImage . Height ;
if ( widthScale < heightScale )
{
designScale = widthScale ;
}
else
{
designScale = heightScale ;
}
}
int width = ( int ) ( tempImage . Width * designScale ) ;
int height = ( int ) ( tempImage . Height * designScale ) ;
2015-12-22 02:09:57 +00:00
if ( width < 1 | | height < 1 )
{
// Image area is too small to update
return ;
}
2015-04-17 03:20:19 +00:00
if ( width ! = tempImage . Width | | height ! = tempImage . Height )
{
// Scale image code from http://stackoverflow.com/questions/1922040/resize-an-image-c-sharp
Rectangle destRect = new Rectangle ( 0 , 0 , width , height ) ;
Bitmap destImage = new Bitmap ( width , height ) ;
destImage . SetResolution ( tempImage . HorizontalResolution , tempImage . VerticalResolution ) ;
using ( var graphics = Graphics . FromImage ( destImage ) )
{
graphics . CompositingMode = CompositingMode . SourceCopy ;
graphics . CompositingQuality = CompositingQuality . HighQuality ;
graphics . InterpolationMode = InterpolationMode . HighQualityBicubic ;
graphics . SmoothingMode = SmoothingMode . HighQuality ;
graphics . PixelOffsetMode = PixelOffsetMode . HighQuality ;
using ( var wrapMode = new ImageAttributes ( ) )
{
wrapMode . SetWrapMode ( WrapMode . TileFlipXY ) ;
graphics . DrawImage ( tempImage , destRect , 0 , 0 , tempImage . Width , tempImage . Height , GraphicsUnit . Pixel , wrapMode ) ;
}
}
// Keep the scaled image and toss the intermediate image
tempImage = destImage ;
}
2013-12-11 00:33:45 +00:00
2016-04-04 20:42:20 +00:00
// About to abandon the current DrawArea object, dispose it now
if ( DrawArea ! = null )
{
DrawArea . Dispose ( ) ;
DrawArea = null ;
}
2015-04-17 03:20:19 +00:00
// Add transparency grid
2013-12-11 00:33:45 +00:00
if ( settings . transparencyGridEnabled )
{
DrawArea = new Bitmap ( tempImage . Width , tempImage . Height ) ;
using ( Graphics g = Graphics . FromImage ( DrawArea ) )
{
Color gridColor = settings . transparencyGridColor ;
using ( Pen gridPen = new Pen ( gridColor ) )
{
int gridSize = settings . transparencyGridSize ;
for ( int xStart = 0 ; ( xStart * gridSize ) < DrawArea . Width ; xStart + + )
{
for ( int yStart = 0 ; ( yStart * gridSize ) < DrawArea . Height ; yStart + + )
{
// Fill even columns in even rows and odd columns in odd rows
if ( ( xStart % 2 ) = = ( yStart % 2 ) )
{
g . FillRectangle ( gridPen . Brush , ( xStart * gridSize ) , ( yStart * gridSize ) , gridSize , gridSize ) ;
}
}
}
}
g . DrawImage ( tempImage , 0 , 0 ) ;
2016-04-04 20:42:20 +00:00
// Done with tempImage
tempImage . Dispose ( ) ;
tempImage = null ;
2013-12-11 00:33:45 +00:00
}
}
else
{
2016-04-04 20:42:20 +00:00
// Keeping the object tempImage was pointing at, so don't dispose it
2013-12-11 00:33:45 +00:00
DrawArea = tempImage ;
}
2015-04-03 06:09:59 +00:00
panel1 . Width = DrawArea . Width ;
panel1 . Height = DrawArea . Height ;
2013-12-07 00:05:15 +00:00
panel1 . Invalidate ( ) ;
2015-04-03 06:09:59 +00:00
panel2LastUpdateSize = panel2 . Size ;
2015-04-17 03:20:19 +00:00
// Update window title
2015-04-17 03:31:15 +00:00
this . Text = System . IO . Path . GetFileName ( loadedFileName ) + " (" + ( designScale * 100 ) . ToString ( "0" ) + "%) - " + APP_TITLE ;
2013-12-07 00:05:15 +00:00
}
2009-06-18 17:19:06 +00:00
private void openFile ( string filename )
{
if ( ! System . IO . File . Exists ( filename ) )
{
2016-03-22 23:48:13 +00:00
// "An error occured while reading the file:"
MessageBox . Show ( Translation . StringID . ERROR_FILE + Environment . NewLine + "File \"" + filename + "\" does not exist" , "File not found" , MessageBoxButtons . OK , MessageBoxIcon . Exclamation ) ;
2009-06-18 17:19:06 +00:00
return ;
}
2016-03-22 23:48:13 +00:00
2016-03-22 23:17:25 +00:00
try
{
design = new PesFile . PesFile ( filename ) ;
}
catch ( System . IO . IOException ioex )
{
2016-03-22 23:48:13 +00:00
// "An error occured while reading the file:"
MessageBox . Show ( Translation . StringID . ERROR_FILE + Environment . NewLine + filename + ":" + Environment . NewLine + ioex . Message , "IOException" , MessageBoxButtons . OK , MessageBoxIcon . Exclamation ) ;
design = null ;
}
catch ( PesFile . PECFormatException pecex )
{
// "This file is either corrupt or not a valid PES file."
MessageBox . Show ( Translation . StringID . ERROR_FILE + Environment . NewLine + filename + ":" + Environment . NewLine + pecex . Message , "PECFormatException" , MessageBoxButtons . OK , MessageBoxIcon . Exclamation ) ;
design = null ;
2016-03-22 23:17:25 +00:00
}
2016-03-22 23:48:13 +00:00
2015-04-17 03:31:15 +00:00
loadedFileName = filename ;
2016-03-22 23:48:13 +00:00
if ( design ! = null )
2009-06-18 17:19:06 +00:00
{
2013-12-07 00:05:15 +00:00
updateDesignImage ( ) ;
2009-06-18 17:19:06 +00:00
if ( design . getFormatWarning ( ) )
{
2013-12-07 06:28:04 +00:00
toolStripStatusLabel1 . Text = translation . GetTranslatedString ( Translation . StringID . UNSUPPORTED_FORMAT ) ; // "The format of this file is not completely supported";
2009-06-18 17:19:06 +00:00
}
else if ( design . getColorWarning ( ) )
{
2013-12-07 06:28:04 +00:00
toolStripStatusLabel1 . Text = translation . GetTranslatedString ( Translation . StringID . COLOR_WARNING ) ; // "Colors shown for this design may be inaccurate"
2009-06-18 17:19:06 +00:00
}
else
{
toolStripStatusLabel1 . Text = "" ;
}
2016-03-22 23:48:13 +00:00
2009-06-18 17:19:06 +00:00
copyToolStripMenuItem . Enabled = true ;
saveDebugInfoToolStripMenuItem . Enabled = true ;
printPreviewToolStripMenuItem . Enabled = true ;
printToolStripMenuItem . Enabled = true ;
rotateLeftToolStripMenuItem . Enabled = true ;
rotateRightToolStripMenuItem . Enabled = true ;
refreshToolStripMenuItem . Enabled = true ;
2015-04-03 06:09:59 +00:00
zoomToolStripMenuItem . Enabled = true ;
2009-06-18 17:19:06 +00:00
showDebugInfoToolStripMenuItem . Enabled = true ;
saveAsBitmapToolStripMenuItem . Enabled = true ;
panel2 . Select ( ) ;
}
else
{
copyToolStripMenuItem . Enabled = false ;
saveDebugInfoToolStripMenuItem . Enabled = false ;
printPreviewToolStripMenuItem . Enabled = false ;
printToolStripMenuItem . Enabled = false ;
rotateLeftToolStripMenuItem . Enabled = false ;
rotateRightToolStripMenuItem . Enabled = false ;
refreshToolStripMenuItem . Enabled = false ;
showDebugInfoToolStripMenuItem . Enabled = false ;
saveAsBitmapToolStripMenuItem . Enabled = false ;
}
}
private void openToolStripMenuItem_Click ( object sender , EventArgs e )
{
string filename ;
2010-01-23 02:59:33 +00:00
if ( settings . lastOpenFileFolder ! = null )
2009-06-18 17:19:06 +00:00
{
2010-01-23 02:59:33 +00:00
openFileDialog1 . InitialDirectory = settings . lastOpenFileFolder ;
2009-06-18 17:19:06 +00:00
}
openFileDialog1 . FileName = "" ;
2013-12-07 06:28:04 +00:00
openFileDialog1 . Filter = translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_PES ) + " (*.pes)|*.pes|" + // "Embroidery Files (*.pes)|*.pes|
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_ALL ) + " (*.*)|*.*" ; // All Files (*.*)|*.*";
2009-06-18 17:19:06 +00:00
if ( openFileDialog1 . ShowDialog ( ) = = DialogResult . OK )
{
filename = openFileDialog1 . FileName ;
if ( ! System . IO . File . Exists ( filename ) )
{
return ;
}
else
{
2010-01-23 02:59:33 +00:00
settings . lastOpenFileFolder = System . IO . Path . GetDirectoryName ( filename ) ;
2009-06-18 17:19:06 +00:00
openFile ( filename ) ;
}
}
}
private void exitToolStripMenuItem_Click ( object sender , EventArgs e )
{
this . Close ( ) ;
}
private void panel1_Paint ( object sender , PaintEventArgs e )
{
if ( DrawArea ! = null )
{
e . Graphics . DrawImage ( DrawArea , 0 , 0 ) ;
}
}
private void aboutToolStripMenuItem_Click ( object sender , EventArgs e )
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( String . Format ( translation . GetTranslatedString ( Translation . StringID . ABOUT_MESSAGE ) , currentVersion ( ) ) ) ; // "EmbroideryReader version " + currentVersion() + ". This program reads and displays embroidery designs from .PES files."
2009-06-18 17:19:06 +00:00
}
private void checkForUpdateToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-09-23 01:38:01 +00:00
EmbroideryReaderUpdates updater = new EmbroideryReaderUpdates ( settings . updateLocation , null , null ) ;
2009-06-18 17:19:06 +00:00
updater . waitForInfo ( ) ;
2009-08-17 18:56:13 +00:00
if ( updater . GetLastError ( ) ! = "" )
2009-08-01 15:23:30 +00:00
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . ERROR_UPDATE ) + // "Encountered an error while checking for updates: "
updater . GetLastError ( ) ) ;
2009-08-01 15:23:30 +00:00
}
2009-06-18 17:19:06 +00:00
else if ( updater . IsUpdateAvailable ( ) )
{
2013-12-07 06:28:04 +00:00
if ( MessageBox . Show ( String . Format ( translation . GetTranslatedString ( Translation . StringID . NEW_VERSION_MESSAGE ) ,
updater . VersionAvailable ( ) , updater . getReleaseDate ( ) . ToShortDateString ( ) , currentVersion ( ) ) + // "Version " + updater.VersionAvailable() + " was released on " + updater.getReleaseDate().ToShortDateString() + ". You have version " + currentVersion() + "."
Environment . NewLine +
translation . GetTranslatedString ( Translation . StringID . NEW_VERSION_QUESTION ) , // "Would you like to go to the Embroidery Reader website to download or find out more about the new version?",
translation . GetTranslatedString ( Translation . StringID . NEW_VERSION_TITLE ) , // "New version available",
MessageBoxButtons . YesNo , MessageBoxIcon . Question ) = = DialogResult . Yes )
2009-06-18 17:19:06 +00:00
{
try
{
System . Diagnostics . Process . Start ( updater . getMoreInfoURL ( ) ) ;
}
catch ( Exception ex )
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . ERROR_WEBPAGE ) + // "An error occured while trying to open the webpage:"
Environment . NewLine + ex . ToString ( ) ) ;
2009-06-18 17:19:06 +00:00
}
}
}
else
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . NO_UPDATE ) + // "No updates are available right now."
Environment . NewLine +
String . Format ( translation . GetTranslatedString ( Translation . StringID . LATEST_VERSION ) ,
updater . VersionAvailable ( ) , currentVersion ( ) ) ) ; // "(Latest version is " + updater.VersionAvailable() + ", you have version " + currentVersion() + ")");
2009-06-18 17:19:06 +00:00
}
}
private void Form1_FormClosing ( object sender , FormClosingEventArgs e )
{
2016-01-12 00:50:02 +00:00
if ( this . WindowState = = FormWindowState . Maximized )
{
settings . windowMaximized = true ;
}
else
{
settings . windowMaximized = false ;
if ( this . WindowState = = FormWindowState . Normal )
{
// If window is not minimized or maximized, save current size
settings . windowWidth = this . Width ;
settings . windowHeight = this . Height ;
}
}
2009-06-18 17:19:06 +00:00
settings . save ( ) ;
}
private string currentVersion ( )
{
return Assembly . GetExecutingAssembly ( ) . GetName ( ) . Version . ToString ( ) ;
}
private void saveDebugInfoToolStripMenuItem_Click ( object sender , EventArgs e )
{
if ( design ! = null )
{
try
{
2013-12-07 00:14:15 +00:00
string debugFile = design . saveDebugInfo ( ) ;
2013-12-07 06:28:04 +00:00
MessageBox . Show ( String . Format ( translation . GetTranslatedString ( Translation . StringID . DEBUG_INFO_SAVED ) , // "Saved debug info to " + debugFile
debugFile ) ) ;
2009-06-18 17:19:06 +00:00
}
catch ( Exception ex )
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . ERROR_DEBUG ) + // "There was an error while saving debug info:"
Environment . NewLine + ex . ToString ( ) ) ;
2009-06-18 17:19:06 +00:00
}
}
else
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . NO_DESIGN ) ) ; // "No design loaded."
2009-06-18 17:19:06 +00:00
}
}
private void preferencesToolStripMenuItem_Click ( object sender , EventArgs e )
{
frmSettingsDialog tempForm = new frmSettingsDialog ( ) ;
2010-01-23 02:59:33 +00:00
tempForm . settingsToModify = settings ;
2013-12-07 06:28:04 +00:00
tempForm . setTranslation = translation ;
2009-06-18 17:19:06 +00:00
if ( tempForm . ShowDialog ( ) = = DialogResult . OK )
{
2010-01-23 02:59:33 +00:00
settings = tempForm . settingsToModify ;
2009-06-18 17:19:06 +00:00
checkSettings ( ) ;
}
2013-12-07 06:28:04 +00:00
loadTranslatedStrings ( settings . translation ) ;
2009-06-18 17:19:06 +00:00
}
private void printToolStripMenuItem_Click ( object sender , EventArgs e )
{
if ( printDialog1 . ShowDialog ( ) = = DialogResult . OK )
{
printDocument1 . Print ( ) ;
}
}
private void printDocument1_PrintPage ( object sender , System . Drawing . Printing . PrintPageEventArgs e )
{
2015-04-17 04:32:06 +00:00
if ( design ! = null )
2009-06-18 17:19:06 +00:00
{
2015-04-17 04:32:06 +00:00
float inchesPerMM = 0.03937007874015748031496062992126f ;
e . Graphics . ScaleTransform ( ( float ) ( e . PageSettings . PrinterResolution . X * inchesPerMM * 0.01f ) , ( float ) ( e . PageSettings . PrinterResolution . Y * inchesPerMM * 0.01f ) ) ;
2016-04-04 20:42:20 +00:00
using ( Bitmap tempDrawArea = design . designToBitmap ( ( float ) settings . threadThickness , settings . filterStiches , settings . filterStitchesThreshold , e . PageSettings . PrinterResolution . X * inchesPerMM * 0.2f ) )
{
e . Graphics . DrawImage ( tempDrawArea , 30 , 30 ) ;
}
2009-06-18 17:19:06 +00:00
}
}
private void printPreviewToolStripMenuItem_Click ( object sender , EventArgs e )
{
printPreviewDialog1 . Document = printDocument1 ;
printPreviewDialog1 . ShowDialog ( ) ;
}
private void copyToolStripMenuItem_Click ( object sender , EventArgs e )
{
if ( DrawArea ! = null )
{
Clipboard . Clear ( ) ;
2016-04-04 20:42:20 +00:00
using ( Bitmap temp = new Bitmap ( DrawArea . Width , DrawArea . Height , System . Drawing . Imaging . PixelFormat . Format24bppRgb ) )
{
using ( Graphics tempGraph = Graphics . FromImage ( temp ) )
{
tempGraph . FillRectangle ( Brushes . White , 0 , 0 , temp . Width , temp . Height ) ;
tempGraph . DrawImageUnscaled ( DrawArea , 0 , 0 ) ;
}
Clipboard . SetImage ( temp ) ;
}
2009-06-18 17:19:06 +00:00
}
}
private void refreshToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
designRotation = 0 ;
updateDesignImage ( ) ;
2009-06-18 17:19:06 +00:00
}
private void rotateLeftToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
designRotation - = 90 ;
if ( designRotation < 0 )
{
designRotation + = 360 ;
}
updateDesignImage ( ) ;
2009-06-18 17:19:06 +00:00
}
private void rotateRightToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
designRotation + = 90 ;
if ( designRotation > = 360 )
{
designRotation - = 360 ;
}
updateDesignImage ( ) ;
2009-06-18 17:19:06 +00:00
}
private void showDebugInfoToolStripMenuItem_Click ( object sender , EventArgs e )
{
if ( design ! = null )
{
try
{
frmTextbox theform = new frmTextbox ( ) ;
theform . showText ( design . getDebugInfo ( ) ) ;
}
catch ( Exception ex )
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . ERROR_DEBUG ) + // "There was an error while saving debug info:"
Environment . NewLine + ex . ToString ( ) ) ;
2009-06-18 17:19:06 +00:00
}
}
else
{
2013-12-07 06:28:04 +00:00
MessageBox . Show ( translation . GetTranslatedString ( Translation . StringID . NO_DESIGN ) ) ; // "No design loaded."
2009-06-18 17:19:06 +00:00
}
}
private void saveAsBitmapToolStripMenuItem_Click ( object sender , EventArgs e )
{
if ( DrawArea ! = null )
{
2016-04-04 20:42:20 +00:00
using ( Bitmap temp = new Bitmap ( DrawArea . Width , DrawArea . Height , System . Drawing . Imaging . PixelFormat . Format24bppRgb ) )
2009-06-18 17:19:06 +00:00
{
2016-04-04 20:42:20 +00:00
using ( Graphics tempGraph = Graphics . FromImage ( temp ) )
{
tempGraph . FillRectangle ( Brushes . White , 0 , 0 , temp . Width , temp . Height ) ;
tempGraph . DrawImageUnscaled ( DrawArea , 0 , 0 ) ;
}
saveFileDialog1 . FileName = "" ;
// "Bitmap (*.bmp)|*.bmp|PNG (*.png)|*.png|JPEG (*.jpg)|*.jpg|GIF (*.gif)|*.gif|TIFF (*.tif)|*.tif|All Files (*.*)|*.*"
saveFileDialog1 . Filter = translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_BMP ) + " (*.bmp)|*.bmp|" +
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_PNG ) + " (*.png)|*.png|" +
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_JPG ) + " (*.jpg)|*.jpg|" +
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_GIF ) + " (*.gif)|*.gif|" +
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_TIFF ) + " (*.tif)|*.tif|" +
translation . GetTranslatedString ( Translation . StringID . FILE_TYPE_ALL ) + " (*.*)|*.*" ;
if ( settings . lastSaveImageLocation ! = null )
2009-06-18 17:19:06 +00:00
{
2016-04-04 20:42:20 +00:00
saveFileDialog1 . InitialDirectory = settings . lastSaveImageLocation ;
}
if ( saveFileDialog1 . ShowDialog ( ) = = DialogResult . OK )
{
string filename = "" ;
filename = saveFileDialog1 . FileName ;
System . Drawing . Imaging . ImageFormat format ;
switch ( System . IO . Path . GetExtension ( filename ) . ToLower ( ) )
{
case ".bmp" : format = System . Drawing . Imaging . ImageFormat . Bmp ; break ;
case ".png" : format = System . Drawing . Imaging . ImageFormat . Png ; break ;
case ".jpg" : format = System . Drawing . Imaging . ImageFormat . Jpeg ; break ;
case ".gif" : format = System . Drawing . Imaging . ImageFormat . Gif ; break ;
case ".tif" : format = System . Drawing . Imaging . ImageFormat . Tiff ; break ;
default : format = System . Drawing . Imaging . ImageFormat . Bmp ; break ;
}
temp . Save ( filename , format ) ;
showStatus ( translation . GetTranslatedString ( Translation . StringID . IMAGE_SAVED ) , 5000 ) ; // "Image saved"
settings . lastSaveImageLocation = System . IO . Path . GetDirectoryName ( filename ) ;
2009-06-18 17:19:06 +00:00
}
}
}
}
private void showStatus ( string text , int msec )
{
toolStripStatusLabel2 . Text = text ;
timer1 . Interval = msec ;
timer1 . Enabled = true ;
}
private void timer1_Tick ( object sender , EventArgs e )
{
toolStripStatusLabel2 . Text = "" ;
}
2013-12-07 06:28:04 +00:00
private void loadTranslatedStrings ( String translationName )
{
translation = new Translation ( translationName ) ;
// File menu
fileToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_FILE ) ;
openToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_OPEN ) ;
saveAsBitmapToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_SAVE_IMAGE ) ;
printToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_PRINT ) ;
printPreviewToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_PRINT_PREVIEW ) ;
exitToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_EXIT ) ;
// Edit menu
editToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_EDIT ) ;
copyToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_COPY ) ;
preferencesToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_PREFS ) ;
// View menu
viewToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_VIEW ) ;
rotateLeftToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . ROTATE_LEFT ) ;
rotateRightToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . ROTATE_RIGHT ) ;
refreshToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_RESET ) ;
2015-04-03 06:09:59 +00:00
zoomToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_SCALE_ZOOM ) ;
fitToWindowToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_FIT_TO_WINDOW ) ;
2013-12-07 06:28:04 +00:00
// Help menu
helpToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_HELP ) ;
checkForUpdateToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . CHECK_UPDATE ) ;
saveDebugInfoToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . SAVE_DEBUG ) ;
showDebugInfoToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . SHOW_DEBUG ) ;
aboutToolStripMenuItem . Text = translation . GetTranslatedString ( Translation . StringID . MENU_ABOUT ) ;
}
2015-04-03 06:09:59 +00:00
2015-04-17 03:20:19 +00:00
private void setDesignScaleSetting ( float scale , bool autoSize , bool updateDesign )
2015-04-03 06:09:59 +00:00
{
2015-04-17 03:20:19 +00:00
if ( autoSize )
2015-04-03 06:09:59 +00:00
{
2015-04-17 03:20:19 +00:00
fitToWindowToolStripMenuItem . Checked = true ;
settings . AutoScaleDesign = true ;
2015-04-03 06:09:59 +00:00
}
else
{
2015-04-17 03:20:19 +00:00
fitToWindowToolStripMenuItem . Checked = false ;
settings . AutoScaleDesign = false ;
designScale = scale ;
2015-04-03 06:09:59 +00:00
}
2015-04-17 03:20:19 +00:00
2015-04-03 06:09:59 +00:00
if ( updateDesign )
{
updateDesignImage ( ) ;
}
}
private void scale100ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 1.0f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale90ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.9f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale80ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.8f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale70ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.7f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale60ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.6f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale50ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.5f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale40ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.4f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale30ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.3f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale20ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.2f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale10ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.1f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void scale5ToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
setDesignScaleSetting ( 0.05f , false , true ) ;
2015-04-03 06:09:59 +00:00
}
private void fitToWindowToolStripMenuItem_Click ( object sender , EventArgs e )
{
2015-04-17 03:20:19 +00:00
// Toggle checked state
fitToWindowToolStripMenuItem . Checked = ! fitToWindowToolStripMenuItem . Checked ;
// Update design
setDesignScaleSetting ( 1.0f , fitToWindowToolStripMenuItem . Checked , true ) ;
2015-04-03 06:09:59 +00:00
}
private void frmMain_ResizeEnd ( object sender , EventArgs e )
{
// Finished resize, update design scale if set to fit-to-window.
// This event also captures window move events, so check if the size
// of panel2 has changed to see if it's really a resize event.
2015-04-17 03:20:19 +00:00
if ( fitToWindowToolStripMenuItem . Checked & & panel2LastUpdateSize ! = panel2 . Size )
2015-04-03 06:09:59 +00:00
{
updateDesignImage ( ) ;
}
}
private void panel2_Resize ( object sender , EventArgs e )
{
// This event is the one we really want, but it fires much too
// frequently during a resize event. So, let ReziseEnd handle most
// of the cases and only process this after a window maximize or
// restore.
if ( maximizeChanged )
{
maximizeChanged = false ;
2015-04-17 03:20:19 +00:00
if ( fitToWindowToolStripMenuItem . Checked )
2015-04-03 06:09:59 +00:00
{
updateDesignImage ( ) ;
}
}
}
2009-06-18 17:19:06 +00:00
}
}