How to add another one consumer in my program? I trying this, but not working...
I find this post how to add consumers in multithreading , but its not what i need, becouse I dont need lock... And i need without class or something like that. Just with my code.. PLease help :)
private int occupiedBufferCount = 0;
private int occupiedBufferCount2 = 0;
int i = 0;
private void Producer()
{
int how_much_numbers = Convert.ToInt32(textBox3.Text);
using (StreamWriter writer = new StreamWriter("random_skaiciai.txt"))
{
for (i = 0; i < how_much_numbers; i++)
{
Monitor.Enter(this);
if ((occupiedBufferCount == 1) || (occupiedBufferCount2 == 1))
{
Monitor.Wait(this);
}
++occupiedBufferCount;
buffer = i;
Random rnd = new Random();
numbers = i;
//numbers = rnd.Next(nuo, iki);
writer.WriteLine(numbers + "");
prm = false;
fib = false;
Monitor.Pulse(this);
Monitor.Exit(this);
if (isCanceled == true)
break;
}
writer.Close();
Set_p(kiek);
}
}
private void Consumer1()
{
int how_much_numbers = Convert.ToInt32(textBox3.Text);
using (StreamWriter writer = new StreamWriter("Primary_numbers.txt"))
{
while (i < how_much_numbers)
{
Monitor.Enter(this);
if ((occupiedBufferCount == 0))
{
Monitor.Wait(this);
}
--occupiedBufferCount;
if (numbers != 0)
if (prime_num(numbers) == true)
{
writer.WriteLine(numbers + "");
}
prm = true;
Monitor.Pulse(this);
Monitor.Exit(this);
if (isCanceled == true)
break;
}
writer.Close();
}
}
private void Consumer2()
{
int how_much_numbers = Convert.ToInt32(textBox3.Text);
using (StreamWriter writer = new StreamWriter("fibon_Numbers.txt"))
{
while (i < how_much_numbers)
{
Monitor.Enter(this);
if ((occupiedBufferCount2 == 0))
{
Monitor.Wait(this);
}
--occupiedBufferCount2;
if (numbers != 0)
if (isfibonaci(numbers) == true)
writer.WriteLine(numbers + "");
Monitor.Pulse(this);
Monitor.Exit(this);
if (isCanceled == true)
break;
}
writer.Close();
}
}
Related
I need to compress more folder at same time in different archivie to goes more quikly.
I tried to use a main backgroundworker and from this I did a for cycle to start other backgroundworker for each folder. I notice that the backgroundworker starts all at same time but not works together what is the best way to do a parallel archive?what you suggest?
to create the archive I use the zipforge library
DoWork of the main backgroundworker
if (Directory.Exists(destination))
{
if (MessageBox.Show("", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
{
goto EXIT_UTENTE;
}
else
{
bool finish = false;
int j = 1;
string dest_appoggio = destination;
do
{
dest_appoggio = destination + "_" + j;
if (Directory.Exists(dest_appoggio))
{
j++;
}
else
{
destination = dest_appoggio;
dataprogressiva = data + "_" + j;
finish = true;
}
}
while (finish == false);
}
}
destinationdefault = destination;
var row_list1 = GetDataGridRows(dgwRobot);
int riga = -1;
foreach (DataGridRow single_row1 in row_list1)
{
bool rowselected = false;
single_row1.Dispatcher.Invoke(new Action(() => { rowselected = single_row1.IsSelected; }));
if (rowselected == true)
{
riga = single_row1.GetIndex();
var robotProcessed = false;
while (!robotProcessed)
{
for (var threadNum = 0; threadNum < MaxBackupContemporanei; threadNum++)
{
if (!threadArray[threadNum].IsBusy)
{
threadArray[threadNum].RunWorkerAsync(riga);
robotProcessed = true;
break;
}
}
}
}
Thread.Sleep(500);
}
bool bwTerminati = false;
while (!bwTerminati)
{
for (var threadNum = 0; threadNum < MaxBackupContemporanei; threadNum++)
{
if (threadArray[threadNum].IsBusy)
{
bwTerminati = false;
threadNum = MaxBackupContemporanei;
}
else
{
bwTerminati = true;
}
}
}
A script on this page is causing your web browser to run slowly
I am trying to get content of multiple web pages in a loop, after browsing ~ 38 URLs the code become irresponsible, below is the code. The intent of this activity. I have looked for multiple option on web nothing helped.
This code section getting the page content of URL passed as parameter
public HtmlAgilityPack.HtmlDocument GetPageSource(string url)
{
webBrowserCtrl = new WebBrowser();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
StringReader content = null;
webBrowserCtrl.ScriptErrorsSuppressed = true;
webBrowserCtrl.Navigate(url);
waitTillLoad(webBrowserCtrl);
IHTMLDocument3 documentAsIHtmlDocument = null;
try
{
documentAsIHtmlDocument = (mshtml.IHTMLDocument3)webBrowserCtrl.Document.DomDocument;
content = new StringReader(documentAsIHtmlDocument.documentElement.outerHTML);
doc.Load(content);
}
catch
{
Console.Write("Exception from web Page: {0}", url);
}
finally
{
if (documentAsIHtmlDocument != null)
{
Marshal.ReleaseComObject(documentAsIHtmlDocument);
documentAsIHtmlDocument = null;
}
content.Dispose();
content.Close();
webBrowserCtrl.Dispose();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
return doc;
}
private void waitTillLoad(WebBrowser webBrControl)
{
while (webBrControl.IsBusy)
Application.DoEvents();
for (int i = 0; i < 500; i++)
{
if (webBrControl.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
{
Application.DoEvents();
Thread.Sleep(10);
}
else
break;
}
WebBrowserReadyState loadStatus;
int waittime = 100000;
//System.Threading.Thread.Sleep(1000000);
int counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
{
break;
}
counter++;
}
}
Your problem is your waitTillLoad function. You should not do ANY processing of the HTML document of any kind, until AFTER you leave the method where your tell your web browser to navigate. Its a threading thing since your web browser and your GUI are on the same thread you need to use the events to get stuff done.
So you should first hook into the DocumentCompleted Event, and then call your waitTillLoad like so:
public HtmlAgilityPack.HtmlDocument GetPageSource(string url)
{
webBrowserCtrl = new WebBrowser();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
StringReader content = null;
webBrowserCtrl.ScriptErrorsSuppressed = true;
webBrowserCtrl.Navigate(url);
webBrowserCtrl.DocumentCompleted += webBrowserCtrl_DocumentCompleted;
}
private void webBrowserCtrl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
waitTillLoad(webBrowserCtrl);
IHTMLDocument3 documentAsIHtmlDocument = null;
try
{
documentAsIHtmlDocument = (mshtml.IHTMLDocument3)webBrowserCtrl.Document.DomDocument;
content = new StringReader(documentAsIHtmlDocument.documentElement.outerHTML);
doc.Load(content);
}
catch
{
Console.Write("Exception from web Page: {0}", url);
}
finally
{
if (documentAsIHtmlDocument != null)
{
Marshal.ReleaseComObject(documentAsIHtmlDocument);
documentAsIHtmlDocument = null;
}
content.Dispose();
content.Close();
webBrowserCtrl.Dispose();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
EmptyWorkingSet(Process.GetCurrentProcess().Handle);
}
return doc;
}
private void waitTillLoad(WebBrowser webBrControl)
{
while (webBrControl.IsBusy)
Application.DoEvents();
for (int i = 0; i < 500; i++)
{
if (webBrControl.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
{
Application.DoEvents();
Thread.Sleep(10);
}
else
break;
}
WebBrowserReadyState loadStatus;
int waittime = 100000;
//System.Threading.Thread.Sleep(1000000);
int counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if ((counter > waittime) || (loadStatus == WebBrowserReadyState.Uninitialized) || (loadStatus == WebBrowserReadyState.Loading) || (loadStatus == WebBrowserReadyState.Interactive))
{
break;
}
counter++;
}
counter = 0;
while (true)
{
loadStatus = webBrControl.ReadyState;
Application.DoEvents();
if (loadStatus == WebBrowserReadyState.Complete && webBrControl.IsBusy != true)
{
break;
}
counter++;
}
}
}
I have a list of numberes, and I want to make a RichTextBox with autocomplete, so when the user start typing a number, it will give him autocomplete options from the list.
And I want it to be in a RichTextBox because I want the user to be able writing each number in a new line in the RichTextBox, so everytime the user presses enter, it will do the whole autocomplete thing all over again.
I don't really have an idea how to et this ting done.
any help would be very thankfull.
Thanks
I'll paste the code here. I never got the positioning of the box correct, so you will have to play around with the YOffset and the XOffset.
In your form OnLoad:
intellisenseRichTextBox.IntellisenseWords = new string[] { "Test", "Foo", "Bar", "Supercalifragilisticexpialidocious" };
intellisenseRichTextBox.YOffset = 132;
intellisenseRichTextBox.XOffset = 70;
And the classes:
public class NotificationForm : Form
{
public NotificationForm()
{
this.ShowInTaskbar = false;
//this.Enabled = true;
this.FormBorderStyle = FormBorderStyle.None;
}
protected override bool ShowWithoutActivation
{
get
{
return true;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams baseParams = base.CreateParams;
const int WS_EX_NOACTIVATE = 0x08000000;
const int WS_EX_TOOLWINDOW = 0x00000080;
baseParams.ExStyle |= (int)(WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
return baseParams;
}
}
}
public class RichTextBoxIntellisense : RichTextBox
{
private NotificationForm intelliAutoCompleteForm;
private ListBox intelliAutoCompleteListBox;
private bool IsNotificationFormShowing;
private bool IsFromReplaceTab;
private bool IsFromMouseClick;
private int _suggestionCount = 20;
public string[] IntellisenseWords { get; set; }
public int YOffset { get; set; }
public int XOffset { get; set; }
public int SuggestionCount
{
get
{
return _suggestionCount;
}
set
{
_suggestionCount = value;
}
}
public RichTextBoxIntellisense()
{
this.AcceptsTab = true;
this.YOffset = 30;
intelliAutoCompleteForm = new NotificationForm();
intelliAutoCompleteForm.Size = new Size(200, 200);
intelliAutoCompleteForm.TopMost = true;
intelliAutoCompleteListBox = new ListBox();
intelliAutoCompleteListBox.Dock = DockStyle.Fill;
intelliAutoCompleteForm.Controls.Add(intelliAutoCompleteListBox);
this.TextChanged += RichTextBoxIntellisense_TextChanged;
this.KeyDown += RichTextBoxIntellisense_KeyDown;
this.KeyPress += RichTextBoxIntellisense_KeyPress;
this.SelectionChanged += RichTextBoxIntellisense_SelectionChanged;
intelliAutoCompleteListBox.Click += IntelliAutoCompleteListBox_Click;
intelliAutoCompleteListBox.SelectedIndexChanged += IntelliAutoCompleteListBox_SelectedIndexChanged;
intelliAutoCompleteForm.Show();
intelliAutoCompleteForm.Hide();
}
private void IntelliAutoCompleteListBox_SelectedIndexChanged(object sender, EventArgs e)
{
if(IsFromMouseClick)
{
if (intelliAutoCompleteListBox.SelectedIndex >= 0)
{
ReplaceCurrentWordWith(intelliAutoCompleteListBox.SelectedItem.ToString());
IsFromReplaceTab = false;
}
}
IsFromMouseClick = false;
}
private void IntelliAutoCompleteListBox_Click(object sender, EventArgs e)
{
IsFromMouseClick = true;
}
private void RichTextBoxIntellisense_SelectionChanged(object sender, EventArgs e)
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
private void RichTextBoxIntellisense_KeyPress(object sender, KeyPressEventArgs e)
{
if (IsFromReplaceTab)
{
e.Handled = true;
IsFromReplaceTab = false;
}
else
{
if(e.KeyChar == (char)Keys.Escape)
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
e.Handled = true;
}
}
}
private void RichTextBoxIntellisense_KeyDown(object sender, KeyEventArgs e)
{
if (IsNotificationFormShowing)
{
if (e.KeyCode == Keys.Up)
{
if(intelliAutoCompleteListBox.Items.Count > 0)
{
if(intelliAutoCompleteListBox.SelectedIndex < 0)
{
intelliAutoCompleteListBox.SelectedIndex = 0;
}
else if(intelliAutoCompleteListBox.SelectedIndex > 0)
{
intelliAutoCompleteListBox.SelectedIndex = intelliAutoCompleteListBox.SelectedIndex - 1;
}
}
e.Handled = true;
}
else if (e.KeyCode == Keys.Down)
{
if (intelliAutoCompleteListBox.Items.Count > 0)
{
if (intelliAutoCompleteListBox.SelectedIndex < 0)
{
intelliAutoCompleteListBox.SelectedIndex = 0;
}
else if (intelliAutoCompleteListBox.SelectedIndex < intelliAutoCompleteListBox.Items.Count - 1)
{
intelliAutoCompleteListBox.SelectedIndex = intelliAutoCompleteListBox.SelectedIndex + 1;
}
}
e.Handled = true;
}
else if (e.KeyCode == Keys.Enter)
{
if(intelliAutoCompleteListBox.SelectedIndex >= 0)
{
ReplaceCurrentWordWith(intelliAutoCompleteListBox.SelectedItem.ToString());
}
e.Handled = true;
}
else if (e.KeyCode == Keys.Tab)
{
if (intelliAutoCompleteListBox.SelectedIndex >= 0)
{
ReplaceCurrentWordWith(intelliAutoCompleteListBox.SelectedItem.ToString());
}
e.Handled = true;
}
}
}
private void RichTextBoxIntellisense_TextChanged(object sender, EventArgs e)
{
if (IntellisenseWords != null && IntellisenseWords.Length > 0)
{
string wordText;
int lastIndexOfSpace;
int lastIndexOfNewline;
int lastIndexOfTab;
int lastIndexOf;
if(this.SelectionStart == this.Text.Length)
{
if(this.SelectionStart > 0 && this.Text[this.SelectionStart - 1] != ' ' && this.Text[this.SelectionStart - 1] != '\t' && this.Text[this.SelectionStart - 1] != '\n')
{
wordText = this.Text.Substring(0,this.SelectionStart);
lastIndexOfSpace = wordText.LastIndexOf(' ');
lastIndexOfNewline = wordText.LastIndexOf('\n');
lastIndexOfTab = wordText.LastIndexOf('\t');
lastIndexOf = Math.Max(Math.Max(lastIndexOfSpace,lastIndexOfNewline),lastIndexOfTab);
if (lastIndexOf >= 0)
{
wordText = wordText.Substring(lastIndexOf + 1);
}
if (PopulateIntelliListBox(wordText))
{
ShowAutoCompleteForm();
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
else
{
char currentChar = this.Text[this.SelectionStart];
if(this.SelectionStart > 0)
{
if(this.SelectionStart > 0 && this.Text[this.SelectionStart - 1] != ' ' && this.Text[this.SelectionStart - 1] != '\t' && this.Text[this.SelectionStart - 1] != '\n'
&& (this.Text[this.SelectionStart] == ' ' || this.Text[this.SelectionStart] == '\t' || this.Text[this.SelectionStart] == '\n'))
{
wordText = this.Text.Substring(0, this.SelectionStart);
lastIndexOfSpace = wordText.LastIndexOf(' ');
lastIndexOfNewline = wordText.LastIndexOf('\n');
lastIndexOfTab = wordText.LastIndexOf('\t');
lastIndexOf = Math.Max(Math.Max(lastIndexOfSpace, lastIndexOfNewline), lastIndexOfTab);
if (lastIndexOf >= 0)
{
wordText = wordText.Substring(lastIndexOf + 1);
}
if(PopulateIntelliListBox(wordText))
{
ShowAutoCompleteForm();
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
}
else
{
intelliAutoCompleteForm.Hide();
IsNotificationFormShowing = false;
}
}
private bool PopulateIntelliListBox(string wordTyping)
{
intelliAutoCompleteListBox.Items.Clear();
List<KeyValuePair<int, string>> tempWords = new List<KeyValuePair<int, string>>();
string[] outArray;
for(int i = 0; i < IntellisenseWords.Length; i++)
{
if(IntellisenseWords[i].StartsWith(wordTyping, StringComparison.CurrentCultureIgnoreCase))
{
tempWords.Add(new KeyValuePair<int, string>(1, IntellisenseWords[i]));
}
}
if(tempWords.Count < _suggestionCount && wordTyping.Length > 1)
{
for (int i = 0; i < IntellisenseWords.Length; i++)
{
if (IntellisenseWords[i].Contains(wordTyping, StringComparison.CurrentCultureIgnoreCase))
{
if(tempWords.Count(c => c.Value == IntellisenseWords[i]) == 0)
{
tempWords.Add(new KeyValuePair<int, string>(2, IntellisenseWords[i]));
}
}
}
}
outArray = tempWords.OrderBy(o => o.Key).Take(_suggestionCount).Select(s => s.Value).ToArray();
intelliAutoCompleteListBox.Items.AddRange(outArray);
return outArray.Length > 0;
}
private void ShowAutoCompleteForm()
{
Point tmpPoint = this.PointToClient(this.Location);
Point tmpSelPoint = this.GetPositionFromCharIndex(this.SelectionStart);
intelliAutoCompleteForm.Location = new Point((-1 * tmpPoint.X) + tmpSelPoint.X + this.XOffset, (-1 * tmpPoint.Y) + tmpSelPoint.Y + this.Margin.Top + this.YOffset);
intelliAutoCompleteForm.Show();
IsNotificationFormShowing = true;
this.Focus();
}
private void ReplaceCurrentWordWith(string Word)
{
string startString = "";
string endString = this.Text.Substring(this.SelectionStart);
string wordText = this.Text.Substring(0, this.SelectionStart);
int lastIndexOfSpace = wordText.LastIndexOf(' ');
int lastIndexOfNewline = wordText.LastIndexOf('\n');
int lastIndexOfTab = wordText.LastIndexOf('\t');
int lastIndexOf = Math.Max(Math.Max(lastIndexOfSpace, lastIndexOfNewline), lastIndexOfTab);
if (lastIndexOf >= 0)
{
startString = wordText.Substring(0, lastIndexOf + 1);
wordText = wordText.Substring(lastIndexOf + 1);
}
this.Text = String.Format("{0}{1} {2}", startString, Word, endString);
if(lastIndexOf >= 0)
{
this.SelectionStart = startString.Length + Word.Length + 1;
}
else
{
this.SelectionStart = Word.Length + 1;
}
IsFromReplaceTab = true;
}
}
I'm reading continuously from a TcpClient streamreader.
The data coming from the stream is raw XML. There is no message framing. So there is now reliable method to know when the message is finished. Though I only have 3 XML messages coming from the server. But when they are coming is unknown. And I can't configure/program the server.
This is my code so far.
public void Start()
{
StreamReader reader = new StreamReader(_tcpClient.GetStream());
char[] chars = new char[Int16.MaxValue];
while (!_requestStop)
{
try
{
while ((reader.Read(chars, 0, chars.Length)) != 0)
{
string s = new string(chars);
s = removeEmptyChars(s);
if (s.IndexOf("<foo", StringComparison.OrdinalIgnoreCase) > 0 &&
s.IndexOf("</foo>", StringComparison.OrdinalIgnoreCase) > 0)
{
Console.WriteLine(s);
OnAlarmResponseComplete(new CustomEventArgs(s));
}
if (s.IndexOf("<bar", StringComparison.OrdinalIgnoreCase) > 0 &&
s.IndexOf("</bar>", StringComparison.OrdinalIgnoreCase) > 0)
{
Console.WriteLine(s);
OnAckComplete(new CustomEventArgs(s));
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
//break;
}
}
reader.Close();
Console.WriteLine("Stopping TcpReader thread!");
}
Then in my main thread I'm processing the events. I'm adding them to a list.
Where I process the list.
When I'm debugging my application, I will be receiving 10 foo and 10 bar messages. And in my lists I have only 1 foo and 1 bar message stored.
Are the eventhandlers to slow to process this? Or am I missing something?
Here is the code you should use to cover all kinds of input issues (foo or bar received partially, foo and bar received together, etc..)
I can't say I approve using string parsing to handle XML content, but anyways.
private static string ProcessAndTrimFooBar(string s, out bool foundAny)
{
foundAny = false;
int fooStart = s.IndexOf("<foo", StringComparison.OrdinalIgnoreCase);
int fooEnd = s.IndexOf("</foo>", StringComparison.OrdinalIgnoreCase);
int barStart = s.IndexOf("<bar", StringComparison.OrdinalIgnoreCase);
int barEnd = s.IndexOf("</bar>", StringComparison.OrdinalIgnoreCase);
bool fooExists = fooStart >= 0 && fooEnd >= 0;
bool barExists = barStart >= 0 && barEnd >= 0;
if ((fooExists && !barExists) || (fooExists && barExists && fooStart < barStart))
{
string fooNodeContent = s.Substring(fooStart, fooEnd - fooStart + 6);
s = s.Substring(fooEnd + 6);
Console.WriteLine("Received <foo>: {0}", fooNodeContent);
OnAlarmResponseComplete(new CustomEventArgs(fooNodeContent));
foundAny = true;
}
if ((barExists && !fooExists) || (barExists && fooExists && barStart < fooStart))
{
string barNodeContent = s.Substring(barStart, barEnd - barStart + 6);
s = s.Substring(barEnd + 6);
Console.WriteLine("Received <bar>: {0}", barNodeContent);
OnAckComplete(new CustomEventArgs(barNodeContent));
foundAny = true;
}
return s;
}
public static void Start()
{
StreamReader reader = new StreamReader(_tcpClient.GetStream());
char[] chars = new char[Int16.MaxValue];
while (!_requestStop)
{
try
{
int currentOffset = 0;
while ((reader.Read(chars, currentOffset, chars.Length - currentOffset)) != 0)
{
string s = new string(chars).TrimEnd('\0');
bool foundAny;
do
{
s = ProcessAndTrimFooBar(s, out foundAny);
} while (foundAny);
chars = s.PadRight(Int16.MaxValue, '\0').ToCharArray();
currentOffset = s.Length;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
//break;
}
}
reader.Close();
Console.WriteLine("Stopping TcpReader thread!");
}
I am having some trouble with the verse button. i am not sure what I am doing wrong but I need to make it where the user presses the verse button and it adds the textview of the word "Verse" to the list that was created. Please help. What am I doing wrong. This was written for Android using C# in Xamarin by the way.
namespace Songression
{
public class CheckRect{
public int top{ get; set; }
public int height{ get; set; }
}
[Activity (Label = "Songression")]
public class results : Activity, View.IOnTouchListener
{
//CheckBox[] check;
List<LinearLayout> linearSet;
//List<CheckRect> rectList;
ScrollView scrollView;
EditText editText = null;
LinearLayout view;
bool moveOrEdit = false;
int screenWidth;
List<String> checkTextList;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView (Resource.Layout.results);
var metrics = Resources.DisplayMetrics;
screenWidth = metrics.WidthPixels;
//var widthInDp = ConvertPixelsToDp(metrics.WidthPixels);
view = FindViewById<LinearLayout> (Resource.Id.linearlayout0);
checkTextList = new List<String>();
checkTextList.Add ("10 bucks in your pocket and barely making it.");
checkTextList.Add ("100 steps to the water");
checkTextList.Add ("18 and going to Hollywood");
checkTextList.Add ("3 years to propose");
String checkTextSet = Intent.GetStringExtra ("MyData") ?? "";
if (checkTextSet == null || checkTextSet == "") {
} else {
String[] textSet = checkTextSet.Split (',');
checkTextList.AddRange (textSet);
}
//Back Button
Button buttonBack = FindViewById<Button> (Resource.Id.buttonBack);
buttonBack.Click += delegate {
Finish();
};
///
//AddLine Button
Button buttonAdd = FindViewById<Button> (Resource.Id.buttonAdd);
buttonAdd.Click += delegate {
addTextPro(false,"");
};
///
//Add Verse
//Button buttonVerse = FindViewById <Button> (Resource.Id.buttonVerse);
//buttonVerse.Click += delegate {
// checkTextList.Add("Verse"));
//};
{
///
//Email Button
Button buttonEmail = FindViewById<Button> (Resource.Id.buttonEmail);
buttonEmail.Click += delegate {
runEmailPro ();
};
scrollView = FindViewById<ScrollView> (Resource.Id.scrollview0);
List<String> resultList = new List<String> ();
int count = checkTextList.Count;//myResources.check_indexSet.Count;
linearSet = new List<LinearLayout> ();
for (int index = 0; index < view.ChildCount; index++) {
view.RemoveViewAt (index);
}
///
//Initiate Rect and Check
if (myResources.isLast == false) {
for (int index = 0; index < count; index++) {
InitiateWidgets (index, false);
}
} else {
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.Path;
var lastPath = Path.Combine (sdCardPath, "lastlasttxt.txt");
String fileNamePath = Path.Combine (sdCardPath, readFileSdcardFile (lastPath));
String loadData;
if (File.Exists (fileNamePath))
loadData = File.ReadAllText (fileNamePath);
else
return;
String[] splitData = loadData.Split ('\n');
foreach (String item in splitData) {
if (item.CompareTo ("") == 0)
continue;
if (item [0] == 't') {
addTextPro (true, item.Substring (1));
}
if (item [0] == 'c') {
bool bChecked = false;
if (item [1] != '0') {
bChecked = true;
} else {
bChecked = false;
}
InitiateWidgets (0, true, item.Substring (2), bChecked);
}
}
}
///
//save function
Button buttonSave = FindViewById<Button> (Resource.Id.buttonSave);
buttonSave.Click += delegate {
saveResultPro ();
};
///
//move function
Button buttonMove = FindViewById<Button> (Resource.Id.buttonMove);
buttonMove.Text = "Move";
buttonMove.Click += delegate {
removeAllFocus (moveOrEdit);
if (moveOrEdit == false) {
buttonMove.Text = "Edit";
moveOrEdit = true;
} else {
buttonMove.Text = "Move";
moveOrEdit = false;
}
};
//final function
Button buttonFinal = FindViewById<Button> (Resource.Id.buttonFinal);
buttonFinal.Click += delegate {
var fResults = new Intent (this, typeof(finalResults));
fResults.PutExtra ("MyData", getAllInfo ());
StartActivity (fResults);
};
}
}
//wirte the file on the sdcard.
public void writeFileSdcardFile(String path,String write_str,bool bTitle){
if (bTitle == true) {
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.Path;
var lastPath = Path.Combine(sdCardPath,"lastlasttxt.txt");
if (File.Exists (path) == false) {
File.WriteAllText (path, write_str);
}
else {
String[] existFile = readFileSdcardFile (path).Split('\n');
foreach (String item in existFile) {
if (write_str.Substring (0, write_str.Length - 1).CompareTo (item) == 0) {
File.WriteAllText (lastPath, write_str.Substring (0, write_str.Length - 1));
return;
}
}
File.AppendAllText (path, write_str);
}
File.WriteAllText (lastPath, write_str.Substring(0, write_str.Length - 1));
} else {
File.WriteAllText (path, write_str);
}
}
public String readFileSdcardFile(String path) {
if (File.Exists (path))
return File.ReadAllText (path);
else
return "";
}
public String getAllInfo()
{
String extra = "";
foreach(LinearLayout linear in linearSet)
{
var widgetType = linear.GetChildAt (0).GetType ().ToString ();
if (widgetType.CompareTo ("Android.Widget.EditText") == 0) {
EditText editText = (EditText)linear.GetChildAt (0);
extra += editText.Text + "\n";
} else if (widgetType.CompareTo ("Android.Widget.CheckBox") == 0) {
CheckBox checBox = (CheckBox)linear.GetChildAt (0);
if (checBox.Checked == true)
extra +="1" + checBox.Text + "\n";
else
extra +="0" + checBox.Text + "\n";
}
}
return extra;
}
//
//run email pro
public void runEmailPro(){
var email = new Intent (Android.Content.Intent.ActionSend);
email.PutExtra (Android.Content.Intent.ExtraEmail,
new string[]{"person1#xamarin.com", "person2#xamrin.com"} );
email.PutExtra (Android.Content.Intent.ExtraCc,
new string[]{"person3#xamarin.com"} );
email.PutExtra (Android.Content.Intent.ExtraSubject, "Hello Email");
email.PutExtra (Android.Content.Intent.ExtraText,
getAllInfo());
email.SetType ("message/rfc822");
StartActivity (email);
}
//
// add Text code
public void addTextPro(bool bLast,String textWidget)
{
LinearLayout linear = new LinearLayout (this);
ImageView imgView = new ImageView (this);
imgView.SetImageResource (Resource.Drawable.delete123);
editText = new EditText (this);
editText.SetSingleLine ();
editText.SetWidth(screenWidth - 50);
if (bLast)
editText.Text = textWidget;
if (moveOrEdit == true)
editText.SetOnTouchListener (this);
else
editText.SetOnTouchListener (null);
linear.AddView(editText);
linear.AddView(imgView);
//delete function.
imgView.Click += delegate {
deleteMessage(imgView);
};
linearSet.Add(linear);
view.AddView(linear);
}
//
//delete message
public void deleteMessage(ImageView imgView)
{
var builder = new AlertDialog.Builder(this);
builder.SetTitle("Delete Phrase!");
builder.SetMessage ("Are you sure you would like to delete this phrase?");
builder.SetPositiveButton("Yes", (sender, args) => {
// Yes button
LinearLayout parent = (LinearLayout)imgView.Parent;
parent.Visibility = ViewStates.Invisible;
int childIndex = view.IndexOfChild(parent);
view.RemoveView(parent);
linearSet.Remove(parent);});
builder.SetNegativeButton("No", (sender, args) => {});
builder.SetCancelable(false);
builder.Show ();
}
//
//save Result
public void saveResultPro()
{
var factory = LayoutInflater.From(this);
var builder = new AlertDialog.Builder(this);
builder.SetTitle("Song Name");
EditText songText = new EditText (this);
builder.SetView (songText);
//builder.SetView(factory.Inflate(Resource.Layout.saveDialog,
// FindViewById<ViewGroup>(Resource.Id.saveDialog)));
builder.SetPositiveButton("OK", (sender, args) => {
var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.Path;
//EditText songText = FindViewById<EditText> (Resource.Id.projectName);
var textPath = Path.Combine(sdCardPath,songText.Text);
var textTitlePath = Path.Combine(sdCardPath,"Titles.txt");
String saveData = "";
foreach(LinearLayout linear in linearSet)
{
var widgetType = linear.GetChildAt (0).GetType ().ToString ();
if (widgetType.CompareTo ("Android.Widget.EditText") == 0) {
EditText editText = (EditText)linear.GetChildAt (0);
saveData += "t" + editText.Text + "\n";
} else if (widgetType.CompareTo ("Android.Widget.CheckBox") == 0) {
CheckBox checBox = (CheckBox)linear.GetChildAt (0);
if (checBox.Checked == true)
saveData += "c1" + checBox.Text + "\n";
else
saveData += "c0" + checBox.Text + "\n";
}
}
writeFileSdcardFile(textTitlePath,songText.Text + "\n",true);
writeFileSdcardFile(textPath,saveData,false);
});
builder.SetNegativeButton("Cancel", (sender, args) => {});
builder.SetCancelable(false);
builder.Show ();
}
//remove All focus
public void removeAllFocus(bool flag){
View.IOnTouchListener context = null;
if (flag == false){
context = this;
}
else{
context = null;
}
foreach (LinearLayout linear in linearSet) {
var widgetType = linear.GetChildAt (0).GetType ().ToString ();
if (widgetType.CompareTo ("Android.Widget.EditText") == 0) {
EditText editText = (EditText)linear.GetChildAt (0);
editText.SetOnTouchListener (context);
} else if (widgetType.CompareTo ("Android.Widget.CheckBox") == 0) {
CheckBox checBox = (CheckBox)linear.GetChildAt (0);
checBox.SetOnTouchListener (context);
}
}
scrollView.SetOnTouchListener (context);
}
//
//initiate widgets
public void InitiateWidgets(int index,bool bLast,String widgetText = "", bool bSel = false){
LinearLayout linear = new LinearLayout (this);
CheckBox check = new CheckBox(this);
ImageView imgView = new ImageView (this);
//delete function.
imgView.Click += delegate {
deleteMessage(imgView);
};
if (bLast == false) {
//int stringIndex = Resource.String.checkname0 + myResources.check_indexSet [index];
check.Text = checkTextList[index];
if (index < 4) {
if (myResources.check_index [index] == 1)
check.Checked = true;
else {
check.Checked = false;
}
} else {
check.Checked = true;
}
} else {
check.Text = widgetText;
check.Checked = bSel;
}
check.SetWidth (screenWidth - 55);
check.SetOnTouchListener (null);
imgView.SetImageResource (Resource.Drawable.delete123);
linear.AddView (check);
linear.AddView (imgView);
linearSet.Add(linear);
view.AddView (linear);
scrollView.SetOnTouchListener (null);
}
//
//Touch Event
float _viewY = 0;
//bool flag = false;
bool check_flag = false;
LinearLayout parentLayout;
int selTop;
int selBottom;
bool downFlag = false;
public bool OnTouch(View v, MotionEvent e)
{
switch (e.Action)
{
case MotionEventActions.Down:
if (v != scrollView) {
_viewY = e.GetY ();
parentLayout = (LinearLayout)v.Parent;
selTop = parentLayout.Top;
selBottom = parentLayout.Bottom;
check_flag = true;
downFlag = true;
}
break;
case MotionEventActions.Move:
if (v == scrollView && downFlag == true) {
var top = (int)(e.GetY () - _viewY);
var bottom = (int)(top + 55);
parentLayout.Layout (parentLayout.Left, top, parentLayout.Right, bottom);
check_flag = false;
}
break;
case MotionEventActions.Up:
if (downFlag == false)
return true;
if (parentLayout == null)
return true;
int originalPos = 0;
int placePos = -1;
downFlag = false;
if (parentLayout.GetChildAt(0).GetType ().ToString ().CompareTo ("Android.Widget.CheckBox") == 0) {
if (check_flag == true) {
CheckBox selCheck = (CheckBox)parentLayout.GetChildAt (0);
if (selCheck.Checked == false) {
selCheck.Checked = true;
} else {
selCheck.Checked = false;
}
check_flag = false;
return true;
}
}
if (parentLayout.GetChildAt(0).GetType ().ToString ().CompareTo ("Android.Widget.EditText") == 0) {
if (check_flag == true) {
EditText selText = (EditText)parentLayout.GetChildAt (0);
check_flag = false;
return true;
}
}
if (v == scrollView) {
int linearCount = linearSet.Count;
int index;
for (index = 0; index < linearCount; index++) {
if (parentLayout == linearSet [index]) {
originalPos = index;
break;
}
}
//Laying position.
for (index = 0; index < linearCount; index++) {
if (originalPos == index)
continue;
if (linearSet[originalPos].Top < linearSet [index].Top) {
if (originalPos == index - 1) {
linearSet[originalPos].Layout (linearSet[originalPos].Left,
selTop, linearSet[originalPos].Right,
selBottom);
return true;
} else {
if (index > originalPos) {
placePos = index - 1;
break;
} else {
placePos = index;
break;
}
}
}
/*if (linearSet [originalPos].Top == linearSet [index].Top) {
linearSet[originalPos].Layout (linearSet[originalPos].Left,
selTop, linearSet[originalPos].Right,
selBottom);
return true;
}*/
}
//Is original pos?
if ((originalPos == linearCount - 1) && (placePos == -1)) {
linearSet[originalPos].Layout (linearSet[originalPos].Left, selTop,
linearSet[originalPos].Right, selBottom);
return true;
}
if (placePos == -1)
placePos = linearCount - 1;
//Change the position on the result page.
int orgTop;
int orgBottom;
orgTop = linearSet [originalPos].Top;
orgBottom = linearSet [originalPos].Bottom;
linearSet [originalPos].Layout (linearSet[originalPos].Left, linearSet [placePos].Top,
linearSet[originalPos].Right, linearSet [placePos].Bottom);
LinearLayout tempLinear = linearSet [originalPos];
if (originalPos >= placePos) {
for (index = originalPos - 1; index >= placePos; index--) {
linearSet [index].Layout (linearSet[originalPos].Left, linearSet [index + 1].Top,
linearSet[originalPos].Right, linearSet [index + 1].Bottom);
linearSet [index + 1] = linearSet [index];
}
} else {
for (index = originalPos + 1; index <= placePos; index++){
linearSet [index].Layout (linearSet[originalPos].Left, linearSet [index - 1].Top,
linearSet[originalPos].Right, linearSet [index - 1].Bottom);
linearSet [index - 1] = linearSet [index];
}
}
linearSet [placePos] = tempLinear;
linearSet [placePos].Layout (linearSet[placePos].Left, orgTop,
linearSet[placePos].Right, orgBottom);
view.RemoveViews (0, view.ChildCount);
for (index = 0; index < linearSet.Count; index++) {
view.AddView(linearSet[index]);
}
}
break;
}
return true;
}
}
}
You missed to register listener to the Button click and override onClick