⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saveloadwindow.cc

📁 UNIX下使用的基于模糊C聚类分析的原码
💻 CC
字号:
//**************************************************************//*   filename: saveloadwindow.cc                              *//*                                                            *//**************************************************************//* programmed by: Thomas Wagner                               *//* last change:  (XXX: not updated)                           *//**************************************************************#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>#include <X11/Xlib.h>#include "saveloadwindow.h"#include "quicksort.h"#include "mainwindow.h"extern unsigned long buttonpix, blackpix, shadowpix, lightpix;extern Cursor maincursor;SaveLoadWindow::SaveLoadWindow (Display * initdisplay,		GC initgc,		MainWindow * initMain,		XFontStruct * fontstruct,		int initx, int inity,		int initokactionnumber,		char *text,		unsigned short initstatus):BigWindow (initdisplay,	   initgc,	   DefaultRootWindow (initdisplay),	   fontstruct,	   initx, inity, 200, 200,	   text, DEFAULT_BDWIDTH){  status = initstatus;  SelectWindowInfo *fileinfo;  fileselectwindow = NULL;  Main = initMain;  okactionnumber = initokactionnumber;  short depth, filenumber = 0, textheight = fontstruct->max_bounds.ascent +  fontstruct->max_bounds.descent, textwidth = 150, fileselectheight = 200;  path = (char *) malloc (sizeof (char) * 3);  sprintf (path, "./");  selectedfile = new TextBox (display,			      gc,			      this,			      fontstruct,			      LOADSAVEOUTSIDEBORDER, LOADSAVEOUTSIDEBORDER,			      textwidth, textheight,			      3, NULL, 1,			      TEXTOPTION_DARK			      | TEXTOPTION_GIVENXPOS			      | TEXTOPTION_TEXTINPUT,			      0, SAVELOAD_SELECTED_OK);//SAVELOAD_TEXTDOUBLECLICKED);  height = selectedfile->Gety () + selectedfile->Getheight () + LOADSAVEINSIDEBORDER;  width = textwidth + 2 * LOADSAVEOUTSIDEBORDER;  fileinfo = Loaddirectory (&filenumber);  fileselectwindow    = new SelectWindow (display,			gc,			this,			fontstruct,			LOADSAVEOUTSIDEBORDER, height,			textwidth, fileselectheight,			fileinfo,			filenumber,		 SAVELOAD_CHANGESELECTED_ACTION, SAVELOAD_TEXTDOUBLECLICKED,			SELECTWINDOWOPTION_EXCLUSIVESELECTION);  height = fileselectwindow->Gety () + fileselectwindow->Getheight () + LOADSAVEINSIDEBORDER;  Cancel = new ActionIcon (display,			   gc,			   this,			   fontstruct, 105, height, 40, 30,	   "Cancel", NULL, 0, 0, SAVELOAD_SELECTED_CANCEL, ICON_SELECTABLE);  OK = new ActionIcon (display,		       gc,		       this,		       fontstruct, 35, height, 40, 30,		   "Ok", NULL, 0, 0, SAVELOAD_SELECTED_OK, ICON_SELECTABLE);  height = OK->Gety () + OK->Getheight () + LOADSAVEOUTSIDEBORDER;  SizeMe (textwidth + 2 * LOADSAVEOUTSIDEBORDER, height);  short newiconxpos = (width - 2 * OK->Getwidth ()) / 4;  OK->PlaceMe (newiconxpos, OK->Gety ());  Cancel->PlaceMe (width - newiconxpos - Cancel->Getwidth (), Cancel->Gety ());  depth = DefaultDepth (display, DefaultScreen (display));  pixmap = XCreatePixmap (display, window, width, height, depth);  XSetForeground (display, gc, buttonpix);  XFillRectangle (display, pixmap, gc, 0, 0, width, height);  DrawBorder (pixmap, 0, 0, width, height, 0, 0, "", HIGH);  DrawBorder (pixmap,	      LOADSAVEOUTSIDEBORDER - 2, LOADSAVEOUTSIDEBORDER - 2,	      textwidth + 6, textheight + 6, 0, 0, "", LOW);  XDefineCursor (display, window, maincursor);  FixMySize ();  SetSelectedInput (ExposureMask);}void SaveLoadWindow::ChangeFunction (unsigned short newstatus,				BigWindow * newParent,				int newokactionnumber,				char *newtext){  status = newstatus;  Parent = newParent;  okactionnumber = newokactionnumber;  text = newtext;  SetWindowName (text);}SelectWindowInfo *SaveLoadWindow::Loaddirectory (short *newfilenumber){  *newfilenumber = 0;  SelectWindowInfo *newfileinfo;  DIR *dir = opendir (path);  if (dir != NULL) {    short pathnumber = 0, filenumber = 0, counter;    short pathcounter = 0, filecounter = 0;    dirent *ep;    char **filenames = NULL, **pathnames = NULL;    while ((ep = readdir (dir))) {      {	char *testpath;	short length = strlen (ep->d_name) + strlen (path) + 1;	testpath = (char *) malloc (sizeof (char) * length);	sprintf (testpath, "%s%s", path, ep->d_name);	DIR *testdir = opendir (testpath);	free (testpath);	if (testdir != NULL) {	  pathnumber++;	  closedir (testdir);	} else	  filenumber++;      }    }    if (filenumber > 0)      filenames = (char **) malloc (sizeof (char *) * filenumber);    if (pathnumber > 0)      pathnames = (char **) malloc (sizeof (char *) * pathnumber);    *newfilenumber = pathnumber + filenumber;    newfileinfo = (SelectWindowInfo *) malloc (sizeof (SelectWindowInfo) * (*newfilenumber));    rewinddir (dir);    while ((ep = readdir (dir))) {      short length = strlen (ep->d_name) + 1;      {	char *testpath;	short pathlength = strlen (ep->d_name) + strlen (path) + 1;	testpath = (char *) malloc (sizeof (char) * pathlength);	sprintf (testpath, "%s%s", path, ep->d_name);	DIR *testdir = opendir (testpath);	if (testdir != NULL) {	  pathnames[pathcounter] = (char *) malloc (sizeof (char) * (length + 1));	  sprintf (pathnames[pathcounter++], "%s/", ep->d_name);	  closedir (testdir);	} else {	  filenames[filecounter] = (char *) malloc (sizeof (char) * length);	  strcpy (filenames[filecounter++], ep->d_name);	}      }    }    quicksort (filenames, filenumber);    quicksort (pathnames, pathnumber);    for (counter = 0; counter < pathnumber; counter++) {      newfileinfo[counter].Selecttext = pathnames[counter];      newfileinfo[counter].options = (int) TEXTOPTION_SELECTABLE	| TEXTOPTION_DOUBLECLICK	| TEXTOPTION_TEXTISPATH	| TEXTOPTION_GIVENXPOS;      newfileinfo[counter].info = (unsigned short) counter;    }// ./ -> ../  ../ -> ./    newfileinfo[0].Selecttext = pathnames[1];    newfileinfo[1].Selecttext = pathnames[0];    for (counter = pathnumber; counter < *newfilenumber; counter++) {      newfileinfo[counter].Selecttext = filenames[counter - pathnumber];      newfileinfo[counter].options = (int) TEXTOPTION_SELECTABLE	| TEXTOPTION_DOUBLECLICK	| TEXTOPTION_GIVENXPOS;      newfileinfo[counter].info = (unsigned short) counter;    }    if (filenames != NULL) {      free (filenames);      filenames = 0;    }    if (pathnames != NULL) {      free (pathnames);      pathnames = 0;    }    closedir (dir);    return newfileinfo;  } else    return NULL;}SaveLoadWindow::~SaveLoadWindow (){  XFreePixmap (display, pixmap);  delete OK;  delete Cancel;  delete fileselectwindow;}void SaveLoadWindow::MapMe (){  Relaoddirectory ();  XMapWindow (display, window);}char SaveLoadWindow::Fileexists (char *filename){  FILE *in;  if ((in = fopen (filename, "r")) == NULL)    return FALSE;  else {    fclose (in);    return TRUE;  }}char *SaveLoadWindow::Getfullfilename (){  char *fullname;  short strlength = strlen (path) + strlen (selectedfile->Gettext ()) + 2;  fullname = (char *) malloc (sizeof (char) * strlength);  strcpy (fullname, path);  strcat (fullname, selectedfile->Gettext ());  return fullname;}void SaveLoadWindow::Onepathup (){  short length = strlen (path);  if (path[length - 2] != '.')	// not ./ or ../ at end   {    short counter, newlength = 0;    for (counter = length - 2; counter >= 0; counter--) {      if (path[counter] == '/') {	newlength = counter + 1;	break;      }    }    char *newpath = (char *) malloc (sizeof (char) * (newlength + 2));    for (counter = 0; counter < newlength; counter++)      newpath[counter] = path[counter];    newpath[newlength] = path[length];    free (path);    path = newpath;  } else {    short plength = strlen ("../") + strlen (path);    char *newpath = (char *) malloc (sizeof (char) * plength);    sprintf (newpath, "%s%s", path, "../");    free (path);    path = newpath;  }}void SaveLoadWindow::Relaoddirectory (){  SelectWindowInfo *fileinfo;  short filenumber;  fileinfo = Loaddirectory (&filenumber);  fileselectwindow->ChangeInfo (fileinfo, filenumber);}void SaveLoadWindow::Action (int Actionnumber, int value){  char buildsavedialog = FALSE;  switch (Actionnumber) {  case SAVELOAD_DIALOG_CONFIRMED:    switch (value) {    case DIALOG_YES_ACTION:      Parent->Action (okactionnumber, (int) Getfullfilename ());      break;    case DIALOG_CANCEL_ACTION:      Parent->Action (okactionnumber, (int) (NULL));      break;    case DIALOG_NO_ACTION:      MapMe ();      break;    }    break;  case SAVELOAD_SELECTED_OK:    switch (status) {    case WORK_AS_LOAD_SELECTOR:      if (Fileexists (Getfullfilename ()))	Parent->Action (okactionnumber, (int) Getfullfilename ());      else {	Main->printError ("File does not exist!");	Parent->Action (okactionnumber, (int) (NULL));      }      break;    case WORK_AS_SAVE_SELECTOR:      if (!Fileexists (Getfullfilename ()))	Parent->Action (okactionnumber, (int) Getfullfilename ());      else	buildsavedialog = TRUE;      break;    }    UnmapMe ();    break;  case SAVELOAD_SELECTED_CANCEL:    Parent->Action (okactionnumber, (int) (NULL));    UnmapMe ();    break;  case SAVELOAD_CHANGESELECTED_ACTION:    if (!(((TextBox *) value)->GetStatus () & TEXTOPTION_TEXTISPATH))      selectedfile->ChangeText (((TextBox *) value)->Gettext ());    break;  case SAVELOAD_TEXTDOUBLECLICKED:    if (((TextBox *) value)->GetStatus () & TEXTOPTION_TEXTISPATH) {      if (strcmp (((TextBox *) value)->Gettext (), "./")) {	if (strcmp (((TextBox *) value)->Gettext (), "../")) {	  short length = strlen (((TextBox *) value)->Gettext ()) +	    strlen (path) + 1;	  char *newpath = (char *) malloc (sizeof (char) * length);	  sprintf (newpath, "%s%s", path, ((TextBox *) value)->Gettext ());	  path = newpath;	} else	  Onepathup ();      } else {	free (path);	path = strdup ("./");      }      Relaoddirectory ();    } else {      UnmapMe ();      switch (status) {      case WORK_AS_LOAD_SELECTOR:	Parent->Action (okactionnumber, (int) (Getfullfilename ()));	break;      case WORK_AS_SAVE_SELECTOR:	buildsavedialog = TRUE;	break;      }    }    break;  }  if (buildsavedialog == TRUE) {    char *dtext1 = "File already exists! Overwrite it?!";    char *dtext2;    short strlength = strlen (dtext1) + strlen (selectedfile->Gettext ()) + 5;    dtext2 = (char *) malloc (sizeof (char) * strlength);    sprintf (dtext2, "File %s already exists! Overwrite it?!", selectedfile->Gettext ());    Dialog *dialog = new Dialog (display,				 gc,				 this,				 fontstruct,				 10, 10, 200, 80,				 dtext2,				 DISPLAY_YES | DISPLAY_NO | DISPLAY_CANCEL,				 SAVELOAD_DIALOG_CONFIRMED);    dialog->MapMe ();  }}void SaveLoadWindow::HandleEvent (XEvent * Event){  switch (Event->type) {  case Expose:    XCopyArea (display, pixmap, window, gc,	       Event->xgraphicsexpose.x, Event->xgraphicsexpose.y,	       Event->xgraphicsexpose.width, Event->xgraphicsexpose.height,	       Event->xgraphicsexpose.x, Event->xgraphicsexpose.y);    break;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -